코딩테스트/python
[programmers/python] 모의고사 - 완전탐색
zyin
2025. 5. 21. 06:08
문제 설명
1번부터 N번까지 총 answers 배열만큼 문제가 주어진다.
세 명의 수포자가 각자 고정된 패턴으로 문제를 찍고 있으며, 정답과 비교했을 때 가장 많은 문제를 맞힌 수포자의 번호를 오름차순으로 리턴해야 한다.
수포자의 답안 패턴
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 리스트를 순회하며 정답을 한 문제씩 비교해본다.
- 수포자의 패턴은 주기적으로 반복되므로, **i % len(패턴)**을 통해 현재 수포자가 찍은 답을 구할 수 있다.
- 이를 정답과 비교하여 맞춘 개수를 각각 저장한다.
- 세 사람 중 가장 높은 점수를 받은 사람의 번호를 오름차순으로 반환한다.
구현 코드
def countAns(answers, pattern):
c = 0
for i in range(len(answers)):
p = pattern[i % len(pattern)]
a = answers[i]
if p == a:
c += 1
return c
def solution(answers):
p1 = [1, 2, 3, 4, 5]
p2 = [2, 1, 2, 3, 2, 4, 2, 5]
p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
cp1 = countAns(answers, p1)
cp2 = countAns(answers, p2)
cp3 = countAns(answers, p3)
_max = max(cp1, cp2, cp3)
answer = []
for i, score in enumerate([cp1, cp2, cp3]):
if score == _max:
answer.append(i + 1) # 수포자 번호는 1부터 시작
return answer
예시 실행
solution([1, 2, 3, 4, 5]) # 결과: [1]
- 1번 수포자: 5문제 맞춤
- 2번 수포자: 0문제
- 3번 수포자: 0문제
→ 결과: [1]
solution([1, 3, 2, 4, 2]) # 결과: [1, 2, 3]
- 세 수포자 모두 2문제씩 정답
→ 결과: [1, 2, 3]
시간 복잡도
- 수포자 3명 × answers의 길이만큼 비교 → O(n)
- 최대 10,000문제까지 비교해도 성능에 전혀 문제가 없다