본문으로 건너뛰기

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

LEGGO1분 미만ProgrammersLv.1

모의고사

문제: 모의고사open in new window
문제: 모의고사

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.

수포자는 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

코드 리펙토링

  1. 최대 점수 계산과 결과 구성을 한 번의 순회로 처리: 최대 점수를 찾고 그 점수를 갖는 수포자를 찾기 위해 두 번의 순회를 하는 대신, 한 번의 순회로 최대 점수와 해당 수포자 인덱스를 동시에 찾을 수 있습니다.

  2. 함수와 변수 이름 명확화: 더 명확한 변수 이름을 사용하여 코드의 의도를 분명하게 할 수 있습니다.

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]