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

oswaldeff·2021년 1월 28일
0
post-thumbnail

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

📝 문제 설명

수포자는 총 3명이다.

각각의 수포자들은 문제를 찍는 자신만의 패턴이 존재한다.

문제의 정답이 순서대로 들은 배열 answers가 주어졌을때,
가장 많은 문제를 맞힌 사람이 누구인지 배열로 return한다.

📝 제한 조건

시험은 최대 10,000 문제로 구성되어있다.

문제의 정답은 1, 2, 3, 4, 5 중 하나이다.

가장 높은 점수를 받은 사람이 여럿일 경우,
return하는 값은 오름차순으로 정렬해야한다.

💻 코드

def solution(answers):
    answer = []
    
    # pattern
    pat1 = [1, 2, 3, 4, 5]
    pat2 = [2, 1, 2, 3, 2, 4, 2, 5]
    pat3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    # omr
    if len(answers) <= len(pat1):
        omr1 = pat1[0:len(answers)]
    if len(answers) > len(pat1):
        omr1 = int(len(answers)/len(pat1))*pat1 + pat1[0:len(answers)%len(pat1)]
    
    if len(answers) <= len(pat2):
        omr2 = pat2[0:len(answers)]
    if len(answers) > len(pat2):
        omr2 = int(len(answers)/len(pat2))*pat2 + pat2[0:len(answers)%len(pat2)]
    
    if len(answers) <= len(pat3):
        omr3 = pat3[0:len(answers)]
    if len(answers) > len(pat3):
        omr3 = int(len(answers)/len(pat3))*pat3 + pat3[0:len(answers)%len(pat3)]
    
    # count
    cnt1 = 0
    for idx, i in enumerate(omr1):
        if i == answers[idx]:
            cnt1 += 1
    
    cnt2 = 0
    for idx, i in enumerate(omr2):
        if i == answers[idx]:
            cnt2 += 1
    
    cnt3 = 0
    for idx, i in enumerate(omr3):
        if i == answers[idx]:
            cnt3 += 1
    
    # score
    score = {1:cnt1, 2:cnt2, 3:cnt3}
    max_score = max(score.values())
    sorted_score = sorted(score.items())
    
    # answer
    for i in range(len(sorted_score)):
        if sorted_score[i][1] == max_score:
            answer.append(sorted_score[i][0])
    
    return answer

📌 pattern

입력값이 answers뿐인것을 확인했으므로
패턴을 파악하는 과정은 불필요하다고 판단되었고,
직접 수포자 3명이 가진 각각의 패턴을 찾아 배열로 놓았다.

📌 omr

수포자들이 작성할 omr카드(문제에서는 없는 내용이다ㅎㅎ)에
대하여 다음과 같은 두가지의 경우를 생각하였다.

입력받는 answers의 길이가 pattern의 길이 이하일 경우,
answers의 길이만큼 pattern을 슬라이싱하였다.

입력받는 answers의 길이가 pattern의 길이를 초과할 경우,
answers를 pattern으로 나누어 몫과 나머지를 구하였고,
몫만큼 pattern을 반복하고 나머지값만큼 슬라이싱하였다.

📌 count

수포자들의 omr카드와 answers를 대조하여 맞힌개수를 count하였다.

📌 score

각각의 수포자들에 대해 대응되는 맞힌개수를 알기 위하여
dictionary로 놓았다.

가장 높은 점수를 받은 사람이 여럿일 경우를 위하여,
맞힌개수의 최고값을 구하였다.

오름차순 정렬을 위하여,
작성한 dictionary를 sorted를 이용하여 정렬하였다.

📌 answer

score dictionary에서 for문이 돌며 맞힌개수의 최고값과 일치할 경우,
answer배열에 append되도록 하였다.

💡 error

채점 결과, 대부분의 정확성 테스트에서 런타임 에러가 발생하였다.

omr배열에서, if조건을 통하여 몫만큼 pattern을 반복하였는데
이때 몫의 값이 float 타입이었기 때문이었다.

결국 해당 몫을 int로 변경해주고나서야 모든 정확성 테스트를 통과할 수 있었다.

dictionary로 접근하지 않고 좀 더 간결하게 푸는법도 생각해보아야겠다.

0개의 댓글