문제
준식이는 수열 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)
}
}
}
'Algorithm > 문제풀이' 카테고리의 다른 글
[백준/Swift] 14888 연산자 끼워넣기 (0) | 2023.05.02 |
---|---|
[알고리즘/Swift] Codility - TapeEquilibrium (0) | 2023.05.02 |
[알고리즘/Swift] 0118 지금 무슨 노래 듣고 있어요?2 (0) | 2023.04.30 |
[알고리즘/Swift] 0117 준식이의 모험2 (0) | 2023.04.30 |
[알고리즘/Swift] 0116 준식이의 모험1 (0) | 2023.04.30 |