수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5
, 1, 2, 3, 4, 5
, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5
, 2, 1, 2, 3, 2, 4, 2, 5
, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5
, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers
가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return
하도록 solution
함수를 작성해주세요.
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return
하는 값을 오름차순 정렬해주세요.
일단, 나는 이 문제 이해하는데 한참 걸렸다. 이유는 위에 있는 찍는 방식을 간과하고 넘어갔기 때문에... 절대 나와 같은 실수를 하지 마씨요
temp
: answers
배열에서 요소를 하나씩 꺼내 저장할 변수answer
: 입력으로 받은 answers
배열은 요소를 꺼낸다던지의 조작이 불가능하기 때문에, 조작이 가능하도록 입력으로 받은 배열을 저장하는 배열score1, score2, score3
: 각 번호의 수포자가 받은 점수를 저장하는 변수winner
: 제일 점수를 많이 받은 수포자의 번호를 저장할 배열(solution
함수의 반환값이 배열이기 때문에 배열로 선언)pick1, pick2, pick3
: 각 번호의 수포자가 문제를 찍는 패턴을 저장하는 배열score1, score2, score3
변수에 정답자만 1을 더해서 저장하면 문제가 모두 끝났을 때 각 수포자의 수학 점수를 알아낼 수 있다.위의 과정을 코드로 나타내면 아래와 같이 나온다.
import Foundation
func solution(_ answers:[Int]) -> [Int] {
var temp = 0, answer = answers, result: [Int] = [], score1 = 0, score2 = 0, score3 = 0, winner: [Int] = []
let pick1 = [1,2,3,4,5], pick2 = [2,1,2,3,2,4,2,5], pick3 = [3,3,1,1,2,2,4,4,5,5]
while answer.count > 0 {
for i in 0..<answer.count {
temp = answer.removeFirst()
score1 = temp == pick1[i % 5] ? score1 + 1 : score1
score2 = temp == pick2[i % 8] ? score2 + 1 : score2
score3 = temp == pick3[i % 10] ? score3 + 1 : score3
}
}
result = [score1, score2, score3]
for i in 1...result.count {
if result[i-1] == result.max() {
winner.append(i)
}
}
return winner.sorted()
}
마지막에, 제일 많이 정답을 맞춘 수포자를 어떻게 선발할 것인지 고민하는 시간을 꽤 길게 가졌다. 그동안에는 비교할 대상이 둘이라서 같거나, 크거나, 작거나 세 가지 경우의 수만 따지면 되었는데(그마저도 < 나 > 연산자 하나로 구분이 가능했던...), 비교해야 할 대상이 3개가 되어버리니 머리가 갑자기 멈췄다.
조금의 시간을 가지고 나니, 이 세 가지의 값을 배열에 저장한 후 배열의 최대값과 각 요소들을 비교하면 해결할 수 있겠다는 생각이 들어서 Array.max()
메소드를 사용했다.
열심히 고민하면 방법은 다 있더라... 문제를 해결할 수 있어서 다행이다!