CodingTest/완전 탐색(구현)

프로그래머스 (Level 1) - 모의고사

seongduck 2022. 8. 7. 17:27

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

2. 제한사항

  • 시험은 최대 10,000 문제로 구성되어 있다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나이다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순으로 정렬

3. 입출력 예

answers return
[1, 2, 3, 4, 5] [1]
[1, 3, 2, 4, 2] [1, 2, 3]
  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2, 3은 모든 문제를 틀렸습니다.

 

  • 수포자 1, 2, 3이 각각 2문제씩 맞췄습니다.

4. 풀이 접근

  1. 1, 2, 3번 수포자가 어떻게 찍는지 패턴을 확인한 후 각 배열에 저장한다.
    1. 제한 조건에서 최대 10,000문제까지 이므로 여기까지 사이클을 만든는 것이 좋겠다.
  2. 정답 길이만큼 반복문들 돌려 정답 맞춘 사람의 스코어 배열에 저장한다.
  3. 가장 높은 점수를 받은 사람이 있을 수 있으므로 정렬하여 리턴한다.

5. 코드

def solution(answers):
    one = [1,2,3,4,5] * 2000
    two = [2,1,2,3,2,4,2,5] * 2000
    thr = [3,3,1,1,2,2,4,4,5,5] * 2000
    
    score = {1 : 0, 2 : 0, 3 : 0}

    for i in range(len(answers)):
        if(one[i] == answers[i]): 
            score[1] += 1
        if(two[i] == answers[i]):
            score[2] += 1
        if(thr[i] == answers[i]):
            score[3] += 1
            
    result = sorted([key for key, value in score.items() if max(score.values()) == value])
    return result
  • 최대 10,000문제 이므로 2000을 곱해줬다.
  • 점수를 나타낼 score 딕셔너리를 만들어줬다.
  • value값이 가장 큰 순서대로 오름차순으로 정렬했다.

6. 알아둘만한 문법

result = sorted([key for key, value in score.items() if max(score.values()) == value])
  • 딕셔너리에서 value값 기준으로 오름차순하기