Slow is better than NOTHING

Programmers 풀이/[LEVEL 1]

[Python] 프로그래머스 - 모의고사

Jeff_Kang 2020. 12. 27. 01:38
반응형

- 문제 설명

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

수포자 친구들이 문제를 찍어 맞추는 숫자를 구하는 문제입니다. 문제 분류는 "완전 탐색" 이며, 주어진 학생들의 답 선택 규칙을 파악하고 이를 코드로 이끌어내면 간단히 풀 수 있었던 문제였습니다.

1번 수포자 : [1,2,3,4,5] 의 반복
2번 수포자 : [2,1,2,3,2,4,2,5] 의 반복
3번 수포자 : [3,3,1,1,2,2,4,4,5,5] 의 반복

주어진 예시에서 다음과 같은 규칙을 발견하셨다면 이 문제는 다 푸 신것이나 다름없습니다.
answer 리스트가 주어질 때 각 요소 값들을 하나씩 "순차탐색" 하여 끝까지 "완전 탐색" 하시면됩니다.
완전 탐색을 하는 코드는 다음과 같습니다. 각 수포자들은 각기 다른 규칙을 가지므로, 규칙을 정의한 리스트 "first_st, second_st, third_st" 를 선언 후 순서대로 answer와 비교하면 됩니다. 

first_st = [1,2,3,4,5] # 1 수포자
second_st = [2,1,2,3,2,4,2,5] # 2 수포자
third_st = [3,3,1,1,2,2,4,4,5,5] # 3 수포자
first_count = 0
second_count= 0
third_count = 0
for index, answer in enumerate(answers):
	if answer == first_st[index%5]: # len(first_st) = 5
		first_count+=1
	if answer == second_st[index%8]: # len(second_st) = 8
		second_count+=1
	if answer == third_st[index%10]: # len(third_st) = 10
		third_count +=1

 

해당 코드를 실행하면 얻을 수 있는 내용은 "각 학생 별 정답 갯수"입니다. 
우리가 구해야 하는 것은 "가장 많은 문제를 맞힌 사람" 이므로 저는 학생 별 맞힌 갯수를 알 수 있는 dict 자료형을 선언하여 해결하고자했습니다.

count_dict = {1: first_count, 2:second_count, 3:third_count}


1. 학생 별 맞춘 갯수를 구한다. --> dict자료형을 이용
2. 1등을 구한다.
3. 1등과 같은 갯수를 맞춘 학생을 찾는다. (가장 높은 점수를 받은 사람이 여럿일 수 있음)

다음과 같은 조건을 만족한 최종 코드는 아래와 같습니다.

더보기
def solution(answers):
    first_st = [1,2,3,4,5]
    second_st = [2,1,2,3,2,4,2,5]
    third_st = [3,3,1,1,2,2,4,4,5,5]
    first_count = 0
    second_count= 0
    third_count = 0
    for index, answer in enumerate(answers):
        if answer == first_st[index%5]:
            first_count+=1
        if answer == second_st[index%8]:
            second_count+=1
        if answer == third_st[index%10]:
            third_count +=1
    count_dict = {1: first_count, 2:second_count, 3:third_count}
    top_score = max(count_dict.values())
    result = [student for student,score in count_dict.items() if score==top_score]
            
    return result
반응형