오늘은 수포자 삼인방의 찍기 방식을 활용해, 주어진 정답 배열과 비교하여 가장 많은 문제를 맞힌 수포자를 찾는 문제를 풀었다. 각 수포자의 패턴을 정의하고, 정답 배열과 비교해 점수를 계산하여 최고 점수를 얻은 수포자를 오름차순으로 반환하는 방식으로 구현했다.
수포자별 패턴 정의: 각 수포자의 찍기 패턴은 고정되어 있으므로 배열로 정의해 활용한다.
수포자 1: [1, 2, 3, 4, 5]
수포자 2: [2, 1, 2, 3, 2, 4, 2, 5]
수포자 3: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
점수 계산: answers 배열을 순회하며 각 수포자의 패턴과 비교해 정답을 맞힌 횟수를 scores 배열에 기록한다.
최고 점수를 찾고 수포자 반환: scores 배열에서 최고 점수를 가진 수포자를 찾고, 동점자가 있을 경우 오름차순으로 정렬해 반환한다.
import Foundation
func solution(_ answers: [Int]) -> [Int] {
// 각 수포자의 패턴 정의
let pattern1 = [1, 2, 3, 4, 5]
let pattern2 = [2, 1, 2, 3, 2, 4, 2, 5]
let pattern3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
// 각 수포자의 점수 초기화
var scores = [0, 0, 0]
// 정답과 패턴 비교
for (index, answer) in answers.enumerated() {
if answer == pattern1[index % pattern1.count] { scores[0] += 1 }
if answer == pattern2[index % pattern2.count] { scores[1] += 1 }
if answer == pattern3[index % pattern3.count] { scores[2] += 1 }
}
// 최고 점수를 찾고, 해당 점수를 가진 수포자들을 오름차순으로 반환
let maxScore = scores.max()!
var result = [Int]()
for (i, score) in scores.enumerated() {
if score == maxScore {
result.append(i + 1)
}
}
return result
}
수포자의 패턴 정의 및 점수 초기화
각 수포자의 찍기 패턴을 배열로 정의하고, 맞힌 문제 수를 저장할 scores 배열을 [0, 0, 0]으로 초기화한다.
정답 비교 및 점수 계산
answers 배열을 순회하며 enumerated()를 사용해 각 문제의 인덱스와 정답을 얻는다.
각 수포자의 패턴과 비교하여 정답을 맞힌 경우 해당 수포자의 점수를 증가시킨다.
index % pattern.count를 통해 패턴이 반복되도록 설정하여 패턴의 길이를 벗어나지 않고 순환하도록 한다.
최고 점수를 가진 수포자 반환
scores 배열의 최고 점수를 찾고, 그 점수를 가진 수포자를 result 배열에 추가한다.
여러 수포자가 최고 점수를 얻은 경우에도 오름차순으로 자동 정렬되어 반환된다.
입출력 예시
반복 패턴 활용: 수포자의 찍기 패턴이 반복되므로, 배열의 인덱스를 mod 연산자로 순환시키는 방식이 매우 유용하다는 것을 깨달았다. 패턴의 길이만큼 나눠 나머지 연산을 통해 원하는 값을 지속적으로 참조할 수 있었다.
최고 점수 찾기와 동점 처리: 최고 점수를 찾고 동점자를 처리하는 작업에서 enumerated()를 통해 인덱스를 가져와 result 배열에 오름차순으로 쉽게 추가할 수 있었다.
패턴과 정답 비교 로직: mod 연산을 사용해 각 수포자의 패턴을 반복하면서, 정답과 비교하는 로직을 구성하는 부분에서 주의가 필요했다. 인덱스 계산이 잘못되면 잘못된 결과가 나올 수 있으므로 꼼꼼하게 조건을 확인했다.
최고 점수 구하기: 여러 수포자가 동점일 경우 오름차순으로 반환해야 하는데, 이 과정에서 최고 점수를 먼저 찾고, 해당 점수를 가진 수포자만 result에 추가하는 구조를 설계하는 데 고민이 있었다.
이번 문제를 통해 반복되는 패턴을 배열과 인덱스를 활용해 처리하는 방법을 배웠다. 또한 최고 점수를 찾고 동점자를 정렬하는 방법을 학습하며, 문제 해결 시 배열을 다루는 다양한 기법을 익히게 되었다. 이를 통해 앞으로도 반복 패턴이 있는 문제에서 효율적으로 접근할 수 있을 것 같다.