[프로그래머스] 모의고사 | Python 문제풀이
1분 미만
모의고사

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
수포자는 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 함수를 작성해주세요.
solution
def solution(answers):
# 수포자들의 패턴
patterns = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
]
# 수포자들의 점수를 저장할 리스트
scores = [0] * 3
# 각 수포자의 패턴과 정답이 얼마나 일치하는지 확인
for i, answer in enumerate(answers):
for j, pattern in enumerate(patterns):
if answer == pattern[i % len(pattern)]:
scores[j] += 1
# 가장 높은 점수 저장
max_score = max(scores)
# 가장 높은 점수를 가진 수포자들의 번호를 찾아서 리스트에 담음
highest_scores = [ ]
for i, score in enumerate(scores):
if score == max_score:
highest_scores.append(i + 1)
return highest_scores
코드 리펙토링
최대 점수 계산과 결과 구성을 한 번의 순회로 처리: 최대 점수를 찾고 그 점수를 갖는 수포자를 찾기 위해 두 번의 순회를 하는 대신, 한 번의 순회로 최대 점수와 해당 수포자 인덱스를 동시에 찾을 수 있습니다.
함수와 변수 이름 명확화: 더 명확한 변수 이름을 사용하여 코드의 의도를 분명하게 할 수 있습니다.
def solution(answers):
# 수포자들의 답안 패턴
patterns = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
]
# 수포자들의 점수 초기화
scores = [0] * 3
# 각 수포자의 답안 패턴을 사용하여 점수 계산
for i, answer in enumerate(answers):
for j, pattern in enumerate(patterns):
if answer == pattern[i % len(pattern)]:
scores[j] += 1
# 최고 점수를 얻은 수포자 찾기
max_score = max(scores)
return [i + 1 for i, score in enumerate(scores) if score == max_score]