프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
수포자 삼인방이 각자의 고유한 규칙으로 정답을 찍을 때, 주어진 정답 배열과 비교하여 가장 많은 문제를 맞힌 사람을 찾는 문제입니다. 정답의 규칙이 없으므로 모든 수포자의 패턴을 전수 조사하는 완전 탐색 방식을 사용합니다.
1. 나의 풀이
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]
users = [p1, p2, p3]
right_answer_cnt = [0, 0, 0]
# 중첩 반복문을 활용하여 각 사용자별 정답 확인
for user_idx, user_answers in enumerate(users):
for answer_idx, answer in enumerate(answers):
# 패턴의 길이를 넘어서는 경우 나머지 연산으로 인덱스 제어
if user_answers[answer_idx % len(user_answers)] == answer:
right_answer_cnt[user_idx] += 1
result = []
# 최고 점수를 받은 사람을 오름차순으로 결과 배열에 삽입
for user_idx, answer_cnt in enumerate(right_answer_cnt):
if answer_cnt == max(right_answer_cnt):
result.append(user_idx + 1)
return result
2. 오늘 배운 점 및 복기 노트
나머지 연산을 활용한 순환
구조 구현 수포자의 찍기 패턴은 일정 주기로 반복됩니다. 이때 문제 번호 인덱스를 패턴의 길이로 나눈 나머지 \( answer\_idx \% len(user\_answers) \)를 활용하면 별도의 조건문 없이도 리스트의 범위를 벗어나지 않고 무한히 순환하는 인덱스를 생성할 수 있습니다.
데이터 구조화의 중요성
각 수포자의 패턴을 별도의 변수로 두기보다 \( users \)와 같은 리스트로 묶어 관리하면 \( enumerate \)를 통해 코드를 간결하게 작성할 수 있음을 확인했습니다.
3. 프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점
단일 루프를 통한 효율적인 채점
나의 풀이에서는 수포자 수만큼 바깥 루프가 도는 중첩 반복문을 사용했으나, 교재에서는 \( answers \)를 한 번만 순회하며 그 안에서 세 명의 점수를 동시에 계산했습니다. 이는 문제 수가 최대치인 10,000개에 도달했을 때 연산의 중복을 줄이는 더 효율적인 접근 방식입니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제 21 - 카펫 (Python) (0) | 2026.05.02 |
|---|---|
| 문제 19 - 호텔 방 배정 (Python) (0) | 2026.04.30 |
| 문제 18 - 모음 사전 (Python) (0) | 2026.04.30 |
| 문제 17 - 하노이의 탑 (Python) (0) | 2026.04.29 |
| 문제 16 - 콜라츠 추측 (Python) (0) | 2026.04.29 |
