본문 바로가기

Algorithm

[파이썬] 프로그래머스: 모의고사

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

완전탐색의 기본 문제입니다.

 

문제 풀이

 

1. 각 수포자의 찍기 패턴을 list로 담아줍니다 (길이 각 5, 8, 10)

그리고 각각의 정답 횟수를 정의해줍니다 (기본 0).

first = [1, 2, 3, 4, 5] #5
second = [2, 1, 2, 3, 2, 4, 2, 5] #8
third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] #10

first_cnt, second_cnt, third_cnt = 0, 0, 0

 

2. 입력된 정답의 길이만큼 for loop

=> 정답을 맞은 사람이면 위에서 정의한 정답 횟수에 1을 더해줍니다.

=> i%5, i%8, i%10 을 사용하여 각 list별 순환이 되도록 해줍니다 (첫번째 수포자의 경우 1, 2, 3, 4, 5, 1, 2, 3, ... 과 같이).

이후 전체 정답 횟수를 한 개의 list에 담습니다.

for i in range(len(answers)):
    if answers[i] == first[i%5]:
        first_cnt += 1
    if answers[i] == second[i%8]:
        second_cnt += 1
    if answers[i] == third[i%10]:
        third_cnt += 1
all_cnt = [first_cnt, second_cnt, third_cnt]

 

3. enumerate를 사용하여 index와 전체 정답 횟수를 for loop

=> 전체 정답 횟수의 최대값과 같으면, 해당 index에서 1을 더한 값을 answer list에 넣어주고 (몇 번째 학생이 가장 많이 맞췄는지 기록), 최종적으로 answer list를 반환해줍니다.

answer = []
for idx, cnt in enumerate(all_cnt):
    if cnt == max(all_cnt):
        answer.append(idx+1)

 

전체 코드

def solution(answers):
    first = [1, 2, 3, 4, 5] #5
    second = [2, 1, 2, 3, 2, 4, 2, 5] #8
    third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] #10

    first_cnt, second_cnt, third_cnt = 0, 0, 0

    for i in range(len(answers)):
        if answers[i] == first[i%5]:
            first_cnt += 1
        if answers[i] == second[i%8]:
            second_cnt += 1
        if answers[i] == third[i%10]:
            third_cnt += 1
    tmp = [first_cnt, second_cnt, third_cnt]
    
    answer = []
    for idx, cnt in enumerate(tmp):
        if cnt == max(tmp):
            answer.append(idx+1)
    
    return answer