본문 바로가기

문돌이 존버/프로그래밍 스터디

(프로그래머스 완전탐색 문제 풀이) 모의고사

반응형

완전탐색: 가능한 상황을 모두 조사해보기

모의고사

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

입출력 예
answers                return
[1,2,3,4,5]                [1]
[1,3,2,4,2]              [1,2,3]

입출력 예 설명
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.
def solution(answers):
    answer = []
    pattern = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    right_num = [0, 0, 0]
    for i in range(len(pattern)):
        for j in range(len(answers)):
            n = len(pattern[i])
            if answers[j] == pattern[i][j%n]: # j%n -> 찍는 루틴 반복
                right_num[i] += 1
    
    for idx, score in enumerate(right_num):
        if score == max(right_num): # 가장 많이 맞춘 사람 출력
            answer.append(idx+1)

    return answer

이번 문제는 "무식해 보일지라도" 모든 가능한 경우를 다 구해서 푸는 완전탐색 방식이다. 1번 수포자부터 3번 수포자까지 모든 패턴을 저장해놓고 정답과 비교하여 몇 개나 맞췄는지 right_num 리스트에 기록하는 것이다. 

코드를 보다시피 for 문을 이중으로 사용하며 정말 각각의 경우에 몇 개를 맞추었는지 업데이트하고 있다. 그리고 마지막에 가장 많이 맞춘 사람을 뽑아 출력하는 것이 끝이다.

이렇게 간단해 보이지만 스스로 풀지 못했다는 것은 함정... 의외로 쉬울 것 같았으나 각 사람이 몇 개를 맞췄는지 어떻게 판단하지가 떠오르지 않았다. 아마 이것을 풀고 있을 때 중요한 일이 있어서 집중을 하지 못했을 수도 있지만.. 핑계는 그만두고 다음에 완전탐색의 다른 문제를 풀어보도록 하겠다.

728x90
반응형