문제

준식이는 수열 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)    
        }
    }
}