본문 바로가기

알고리즘풀이/프로그래머스

[Lv1.] 완전탐색 - 모의고사

👉 사용 언어 : PYTHON3

모의고사

✅ Solution

def solution(answers):
    ans = [0, 0, 0]
    dic = {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]}
    # 5, 8, 10의 최소 공배수 = 40
    for i in range(len(answers)):
        for j in dic:
            if answers[i] == dic[j][i%len(dic[j])]:
                ans[j-1] += 1
    for k in range(3):
        if max(ans[:3]) == ans[k]:
            ans.append(k+1)
    return sorted(ans[3:])

 

👉 문제 설명 및 제한 사항

  • 수포자 (= 문제 푸는 사람) : 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, ... 반복
  • 매개변수 : 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers
    • 길이 <= 10,000
    • 원소 : 1 ~ 5
  • 리턴값 : 가장 많은 문제를 맞힌 사람이 누구인지❓ 
    • 가장 높은 점수를 받은 사람이 여럿일 경우, 오름차순 정렬

 

👉 아이디어

  • 1번은 5개 씩, 2번은 8개 씩, 3번은 10개 씩 반복되는 숫자로 정답을 찍는다.
  • answers 배열 길이만큼 반복문을 돌리고 내부에서 dic 딕셔너리의 값을 차례로 뽑는다.
  • 현재 answers 원소와 dic 의 key에 맵핑된 value 같으면 ans 배열[key-1]+1을 카운트한다.
    • 딕셔너리 dic의 각 value 는 1번, 2번, 3번 수포자가 찍는 반복되는 숫자 리스트를 저장하고 있다.
    • 반복문 내에서 [i%len(dic[j])] 는 value의 숫자리스트를 계속 순회하도록 한다.
    • (EX) 1번 수포자 > [0%5] = [0] = 1, [1%5] = [1] = 2, [2%5] = [2] = 3, [3%5] = [3] = 4, [4%5] = [4] = 5, [5%5] = [0] = 1, ... 반복
  • ans를 순회하며 max값 같은 값 인덱스 를 ans에 추가한다.
    • 이때 주의해야할 것은, ans에 계속 값을 추가하는 방식으로 구현했기 때문에 ans가 변한다.
    • max() 를 사용할때 ans가 아닌 초기 ans값ans[:3] 을 써줘야한다.
  • 리턴해야할 값은 나중에 ans에 추가한 값 들이므로 ans[3:] 을 통해 범위를 제한하여 정렬 한 후, 리턴한다.

 

 다른 사람 풀이 참고

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

 

👉 깨달은 것 / 알게된 것

  • enumerate를 이용하면 idx와 컬렉션의 원소를 튜플 형태로 반환한다.
    • idx와 값을 맵핑해야한다면, enumerate를 제일 먼저 떠올리자❗
  • 배열을 하나 더 정의 하더라도, 기존 배열에 추가해서 슬라이싱을 쓰고 - 이런 방법보다 더 깔끔한 코드를 작성할 수 있다.