각각 수포자가 찍는 패턴을 p1, p2, p3로 정의하였다. 그리고 인덱스를 0부터 answers의 길이 전까지 돌리면서 정답이면 counts에 해당하는 수포자의 value를 1 더하는 방식으로 채점하였다. 그리고 최대 정답자의 번호를 오름차순으로 정렬해 반환하였다.
그런데 제출해보니 오류가 발생하였다.😱
func solution(_ answers:[Int]) -> [Int] {
let p1 = [1, 2, 3, 4, 5]
let p2 = [2, 1, 2, 3, 2, 4, 2, 5]
let p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
var counts = [1: 0, 2: 0, 3: 0]
for i in 0..<answers.count {
if answers[i] == p1[i] { counts[1]! += 1 }
if answers[i] == p2[i] { counts[2]! += 1 }
if answers[i] == p3[i] { counts[3]! += 1 }
}
return counts.filter { $0.value == counts.values.max() }.keys.sorted()
}
구글링해보니 보통은 Array의 Index out of range 문제, 옵셔널 문제, 잘못된 수식 문제라고 한다. 뭐가 문제일까.
이전에 풀었어서 기본적인 실수를 하고 말았다😂. 애초에 p1, p2, p3라고 정의한 게 문제를 푸는 패턴때문이었는데 말이다. 인덱스를 각각 패턴 길이에 따라 나눴다.
func solution(_ answers:[Int]) -> [Int] {
let p1 = [1, 2, 3, 4, 5]
let p2 = [2, 1, 2, 3, 2, 4, 2, 5]
let p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
var counts = [1: 0, 2: 0, 3: 0]
for i in 0..<answers.count {
if answers[i] == p1[i % 5] { counts[1]! += 1 }
if answers[i] == p2[i % 8] { counts[2]! += 1 }
if answers[i] == p3[i % 10] { counts[3]! += 1 }
}
return counts.filter { $0.value == counts.values.max() }.keys.sorted()
}