플랫폼 | 번호 | 제목 | 유형 | 난이도 | 언어 |
---|---|---|---|---|---|
프로그래머스 | 42840 | 모의고사 | 완전탐색 | Lv.1 | Swift, Python |
다 탐색을 하는 거라 특별한 알고리즘은 없다. 얼마나 간결하게 코드를 작성하느냐가 중요하다.
1번 수포자가 찍는 방식 : 1, 2, 3, 4, 5 ... 반복 (5개)
2번 수포자가 찍는 방식 : 2, 1, 2, 3, 2, 4, 2, 5 ... 반복 (8개)
3번 수포자가 찍는 방식 : 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 ... 반복 (10개)
문제 정답(answers
)이 리스트로 주어졌다. 그리고 answers
의 각 index로 index%(반복되는 답 개수)
를 계산하여 각 수포자가 찍는 답을 알 수 있다.
⬇️ 예시
pick = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
]
for i, answer in enumerate(answers):
if answer == pick[0][i%5]: result[0][1] += 1
if answer == pick[1][i%8]: result[1][1] += 1
if answer == pick[2][i%10]: result[2][1] += 1
그리고 조건에 맞게 가장 많은 문제를 맞힌 사람을 return하면 된다.
import Foundation
func solution(_ answers:[Int]) -> [Int] {
let pick = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
]
var result: [(Int, Int)] = [(1, 0), (2, 0), (3, 0)]
for (j, ans) in answers.enumerated() {
if ans == pick[0][j%5] { result[0].1 += 1 }
if ans == pick[1][j%8] { result[1].1 += 1 }
if ans == pick[2][j%10] { result[2].1 += 1 }
}
return result.filter{$0.1 == result.max{$0.1 < $1.1}!.1}.map{$0.0}
}
def solution(answers):
pick = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
]
result = [[1, 0], [2, 0], [3, 0]]
for i, answer in enumerate(answers):
if answer == pick[0][i%5]: result[0][1] += 1
if answer == pick[1][i%8]: result[1][1] += 1
if answer == pick[2][i%10]: result[2][1] += 1
return list(map(lambda item: item[0], list(filter(lambda item: item[1] == max(result, key=lambda item: item[1])[1], result))))
python 마지막 줄을 보면 고차함수가 매우 복잡하게 섞여있다. 저 정도면 그냥 반복문으로 하는것이 더욱 가독성이 좋을것 같다.