[알고리즘/Swift] 0119 스파이를 찾아라!
문제
준식이는 수열 A[1], A[2], …, A[N] (N ≥ 3) 을 가지고 있다. 이 수열에서 단 한 개의 수를 제외하고 나머지 수는 모두 같다. 그 수는 수열에서 몇 번째에 위치할까?
입력
첫째 줄에 테스트 케이스의 개수 T 가 주어진다. 각 테스트 케이스의 첫째 줄에 수열의 길이 N (3 ≤ N ≤ 100)이 주어진다. 둘째 줄에 A[1], A[2], …, A[N]이 주어진다. 수열의 i번째 원소는 정수 A[i] (1 ≤ A[i] ≤ 100)이다. 주어지는 수열에서 단 한 개의 수를 제외하고 나머지 수는 모두 같다.
출력
각 테스트 케이스마다 문제의 정답이 수열에서 몇 번째에 위치하는지 출력한다.
// 입력
1
5
1 4 4 4 4
// 출력 : 1
풀이
이번 문제는 배열을 순회하는 간단한 문제였다
원소의 개수가 N인 경우, 1부터 N-1번째 원소까지 순회하면서 바로 직전 i-1번째 원소랑 비교를 한다
i번째 원소와 i-1번째 원소가 다를 경우에 처리를 해준다
다를 경우 두 원소중에 스파이인 놈을 찾기 위해 추가적으로 i번째 원소와 i+1번째 원소를 비교한다
- array[i] == array[i+1] 일 경우 스파이는 array[i-1]
- 반대의 경우 스파이는 array[i]가 된다
for문을 다 돌아서 배열의 (N-1번째) 원소값에 접근했을 때, 스파이를 찾지 못했다면 (N번쨰) 마지막 원소가 스파이가 된다!\
신경 써야할 점
배열에 관련된 알고리즘 문제를 풀 때 고려해야 할 점들이 있다
- 배열의 시작과 끝 Index를 잘 맞춰줘야 한다 (특히 for문 사용 시 out of index 에러 조심)
- 출력시 배열은 0부터 시작하지만 문제에서는 1부터 시작하게끔 출력하도록 요구하는 경우가 있다
코드
import Foundation
let T = Int(readLine()!)!
for _ in 1...T {
let N = Int(readLine()!)!
let array = readLine()!.split(separator : " ").map{Int(String($0))!}
for i in 1...N-2 {
//배열을 순회하면서 바로 앞에 있는 원소랑 비교 다를 경우
if array[i] != array[i-1] {
if array[i+1] == array[i] { // 앞에 있는 원소가 target인 경우
print(i)
break
}else{ // 현재 원소가 target인 경우
print(i+1)
break
}
}
if i == N-2 {
print(i+2)
}
}
}