[프로그래머스 / lv.1] 모의 고사


날짜: 2021년 7월 19일
소요 시간: 23분 33초
카테고리: 완전 탐색
태그: 레벨1, 파이썬

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

입출력 예시

answersresult
[1,2,3,4,5][1]
[1,3,2,4,2][1,2,3]

내가 적은 코드

def solution(answers):
    num1 = [1, 2, 3, 4, 5]
    num2 = [2, 1, 2, 3, 2, 4, 2, 5]
    num3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    count1, count2, count3 = 0, 0, 0
    arr, answer = list(), list()
    for j, i in enumerate(answers):
        if i == num1[j % (len(num1))]:
            count1 += 1
        if i == num2[j % (len(num2))]:
            count2 += 1
        if i == num3[j % (len(num3))]:
            count3 += 1

    arr.append(count1)
    arr.append(count2)
    arr.append(count3)
    answer = [k + 1 for k, count in enumerate(arr) if count == max(arr)]
    
    return answer

풀이 과정

수포자 1, 2, 3의 찍는 반복 패턴을 분석해 num1,num2,num3에 배열 형태로 저장한다.
answers의 인덱스와 num 배열의 길이만큼 나눈 나머지의 num 배열의 인덱스에 있는 값과 answers의 같은 인덱스에 있는 값을 비교하여 count 해준다.
count 1, 2, 3을 arr 배열에 저장한 뒤 arr의 최댓값과 값이 같은 인덱스에 +1한 값(배열의 인덱스는 0부터 시작하기 때문)을 answer에 저장하고 리턴한다.
(변수 이름 설정을 헷갈리게 잘못 설정했는데 answeranswers 다름 주의)

베스트 코드 1

def solution(answers):
    pattern1 = [1,2,3,4,5]
    pattern2 = [2,1,2,3,2,4,2,5]
    pattern3 = [3,3,1,1,2,2,4,4,5,5]
    score = [0, 0, 0]
    result = []

    for idx, answer in enumerate(answers):
        if answer == pattern1[idx%len(pattern1)]:
            score[0] += 1
        if answer == pattern2[idx%len(pattern2)]:
            score[1] += 1
        if answer == pattern3[idx%len(pattern3)]:
            score[2] += 1

    for idx, s in enumerate(score):
        if s == max(score):
            result.append(idx+1)

    return result

베스트 코드 2

from itertools import cycle

def solution(answers):
    giveups = [
        cycle([1,2,3,4,5]),
        cycle([2,1,2,3,2,4,2,5]),
        cycle([3,3,1,1,2,2,4,4,5,5]),
    ]
    scores = [0, 0, 0]
    for num in answers:
        for i in range(3):
            if next(giveups[i]) == num:
                scores[i] += 1
    highest = max(scores)

    return [i + 1 for i, v in enumerate(scores) if v == highest]

반성

  • 베스트 코드 1과 전반적인 로직은 같지만 count 변수를 +1씩하여 arr에 append하는 것 보다 베스트 코드처럼 애초에 배열형태로 만들고 +1을 하는 게 좀 더 간편하다.
  • 베스트 코드 2의 배열을 무한히 반복할 때 사용하는 intertools 라이브러리의 cycle함수는 처음 봤는데 기억해 둬야겠다.




© 2021. by hminkim