본문 바로가기

프로그래밍 언어/Python3

[프로그래머스 코딩테스트 연습] 완전 탐색 1. 모의고사

완전탐색 Exhaustive Search

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 함수를 작성해주세요.

 

제한사항

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

테스트 케이스 

# test case 1
answers = [1,2,3,4,5]
print(solution(answers))

# test case 2
answers=[1,3,2,4,2]
print(solution(answers))

솔루션 소스코드 

def solution(answers):
    answer = []
    s1 = [1,2,3,4,5]
    s2 = [2,1,2,3,2,4,2,5]
    s3 = [3,3,1,1,2,2,4,4,5,5]
    scores = [0,0,0]

    for i in range(len(answers)):
        if answers[i] == s1[i%len(s1)]:
            scores[0] += 1

        if answers[i] == s2[i%len(s2)]:
            scores[1] += 1

        if answers[i] == s3[i%len(s3)]:
            scores[2] += 1
    

    for j in range(3):
        if scores[j] == max(scores):
            answer.append(j+1)

    return sorted(answer)
  • 완전 탐색을 활용하는 문제였기 때문에 가능한 모든 경우의 수를 확인해보려고 했습니다.
  • 그래서 모든 문제에 대하여 s1, s2, s3이 맞췄는지 검사를 하였고, 답이 일치했다면 각 s1, s2, s3에 대응하는 scores[0], scores[1], scores[3]을 1씩 증가시켰습니다.
  • 이때 시험 문제는 최대 1000 문제이기 때문에 각 학생들의 정답 패턴을 반복시켜가며 확인하기 위해 각 학생의 정답 패턴의 길이로 나눈 나머지 값을 비교 인덱스로 설정하였습니다.
  • 예를 들어 s1의 정답 패턴 길이가 5 (len(s1) = 5) 라면 i = 1 일때 answers[1]과 s1[1%5 즉, 1]을 비교하고, ... , i = 6일때, answers[6]과 s1[6%5 즉, 1]을 비교하는 것입니다.
  • 이렇게 scores 배열에 각 학생의 정답 개수를 저장하고, 그 배열 중 max 값과 일치하는 score의 인덱스 + 1 값을 반환할 answer 배열에 넣어줍니다.
  • 여기서 인덱스 + 1을 하는 이유는 문제에서 각 학생의 인덱스를 0 이 아닌 1부터 시작했기 때문입니다.
  • 그리고 오름차순으로 답을 반환하라고 했기 때문에 sorted(answer)을 반환합니다.