알고리즘

[프로그래머스] 모의고사_Python_완전탐색

작은코딩 2022. 5. 1. 18:24

🔒 문제

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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문제씩을 맞췄습니다.

🔓 풀이

🔑 요구사항 파악

1. 요구사항 : 주어지는 answers을 3가지 방법으로 탐색, 가장 많이 일치한 번호를 리턴. 중복 시 오름차순 정렬

2. Type

 - Input | answers: List[int]

 - Output | answer: List[int] 오름차순


🔑 문제 정의

1. 3가지 탐색 방법 정의

2. 수포자 방법 반복하기

3. 채점 결과 max 구하기


🔑 문제 해결 방법 고민하기

1. 3가지 탐색 방법 정의
 - 1: 1~5 반복
 - 2: 2와 2를 제외한 1~4를 번갈아가며 반복
 - 3: 3,1,2,4,5 순으로 각각 2번씩 반복 

2. 수포자 방법 반복하기
 - answers의 인덱스를 각 수포자 방법의 길이로 나누어 인덱싱

3. 채점 결과 max 구하기
 - if 조건문을 통해 가장 많이 맞춘 개수를 구하고 각 개수와 일치하는 방법을 answer에 추가

 

<고민의 흔적>


🔑 문제 해결 / 코드

def solution(answers):
    answer = []
    method1 = [1,2,3,4,5]
    method2 = [2, 1, 2, 3, 2, 4, 2, 5]
    method3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    result1 = 0
    result2 = 0
    result3 = 0

    for index, value in enumerate(answers):
        if value == method1[index % len(method1)]:
            result1 += 1
        if value == method2[index % len(method2)]:
            result2 += 1
        if value == method3[index % len(method3)]:
            result3 += 1

    max_result = result1
    if result2 > max_result:
        max_result = result2

    if result3 > max_result:
        max_result = result3

    if result1 == max_result:
        answer.append(1)

    if result2 == max_result:
        answer.append(2)

    if result3 == max_result:
        answer.append(3)

    return answer

answers = [1,3,2,4,2]

print(solution(answers))

💉 피드백

1. 수포자 찍기 방법 반복하기

처음엔 조금 헤맸지만 그래도 인덱스를 각 리스트의 길이로 나누는 방법은 알맞게 접근

 

2. score 카운팅

스코어를 리스트로 만들었으면 불필요한 변수도 없앨 수 있고 max 스코어를 정답으로 뽑는 과정도 쉽게 접근이 가능했다.

 

풀이 중간에 복잡하게 고민하다 보니 진도가 안 나가서 한줄 두줄 코드를 적어봤는데,,, 완성은 했지만 if문이 너무 남발된 코드가 튀어나왔다. 😂

 


📌 도전 과제

레벨 1문제인데 시간이 40분 정도 걸렸다. 스스로 정답을 도출하긴 했는데 초반 삽질을 많이 해서,, 

문제 푸는 시간을 단축해보자!!