본문 바로가기

알고리즘/프로그래머스

[프로그래머스][2021 Dev-Matching: 웹 백앤드 개발자(상반기)][Python] 로또의 최고 순위와 최저 순위

문제를 정리해보자.

 

로또는 1부터 45까지 숫자 중에서 6개를 찍어서 맞히는 대표적인 복권이다.

아래는 로또의 순위를 정하는 방식이다.

 

 

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

 

 

민우는 로또를 구매했다. 하지만 숫자 몇 개는 알아볼 수 없게 됐다.

민우의 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보자.

(0은 알아볼 수 없는 숫자이다.)

 

예)

민우의 번호 : 44, 1, 0, 0, 31, 25

당첨 번호 : 31, 10, 45, 1, 6, 19

 

최고 순위 : 3등 (4개 번호가 일치)

최저 순위 : 5등 (2개 번호가 일치)

 


 

 

풀이를 생각해보자.

 

먼저, 민우가 구매한 로또의 번호와 당첨 번호가 몇 개가 일치하는지 확인한다.

그리고 최고 순위와 최저 순위를 구한다.

 

최고 순위 : 0이 모두 당첨 숫자가 일 때이다.

최저 순위 : 0이 모두 당첨 숫자가 아닐 때이다.

 

 

예)

민우의 번호 : 44, 1, 0, 0, 31, 25

당첨 번호 : 31, 10, 45, 1, 6, 19

 

일치하는 번호 개수 : 2개 (1, 31)

0의 개수 : 2개

 

최고 순위 : 3등 (일치하는 번호 개수 + 0의 개수 : 4개)

최저 순위 : 5등 (일치하는 번호 개수 : 2개)

 


 

 

구현해보자.

 

민우가 구매한 로또의 번호와 당첨 번호의 비교를 위해서,

두 리스트를 정렬한 후 index로 순차적 비교를 했다.

 

def solution(lottos, win_nums):

    lottos.sort()
    win_nums.sort()

    rank = {6: 1, 5: 2, 4: 3, 3: 4, 2: 5, 1: 6, 0: 6}

    result = 0
    zero = 0

    i = 0
    j = 0

    while i < 6 and j < 6:
        if lottos[i] == win_nums[j]:
            i += 1
            j += 1
            result += 1

        elif lottos[i] > win_nums[j]:
            j += 1

        else:
            if lottos[i] == 0:
                zero += 1

            i += 1

    return [rank[result + zero], rank[result]]


print(solution([44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19]))

 

비교 시간복잡도는 O(N)이다.