Algorithm/Programmers

[Programmers] 로또의 최고 순위와 최저 순위

j4ko 2023. 3. 3. 14:31
728x90
반응형
민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.


풀이 과정

문제에서 주어진 대로 풀기 위한 과정을 생각하고 구현했다가 틀렸었다. 왜 틀렸지하고 유심히 생각하는데 1~2시간 정도 썼는데 해답을 찾진 못해서 다른 풀이를 보다가 다시 내 코드를 보니 어디가 틀렸는지 알 것 같았다.

문제 풀이를 위해 다음과 같은 핵심적인 로직 부분을 다음과 생각했다.
1. lottos 배열에서 0을 제외하고 맞춘 번호를 현재 최저 순위로 기준을 정한다.
2. 제외한 0의 갯수 만큼 최저 순위에 더해 최고 순위를 산출한다.

아래는 처음 풀이한 코드이다.

첫 번째 시도

def solution(lottos, win_nums):
    _rank = {
        6: 1,
        5: 2,
        4: 3,
        3: 4,
        2: 5,
        0: 6
    }
    if sorted(lottos) == sorted(win_nums):
        return [1, 1]

    select_lottos = [x for x in lottos if x]
    select_zero = [0] * lottos.count(0)

    win_lottos = set(select_lottos).intersection(set(win_nums))
    selectable_nums = set(win_nums) - set(select_lottos)

    min_rank = len(win_lottos)  # 최저
    max_rank = 0  # 최고

    if len(select_zero) <= len(selectable_nums):
        max_rank = min_rank + len(select_zero)

    answer = [_rank.get(max_rank), _rank.get(min_rank)]
    answer.sort()

    return answer

그런데 위 코드는 틀렸다.

왜 틀렸을까?

1~2시간 정도 생각했다가 다른 풀이를 보고서 이해하게 됬다. 위 코드의 경우 아래 테스트 케이스를 통과하지 못한다.

# TC
lottos = [0, 0, 0, 0, 0, 1]
win_nums = [1, 2, 3, 4, 5, 6]

 위 테스트 코드는 선택한 lottos 배열에서 1개가 당첨된 경우를 기준으로 하고 있다. 그렇기 때문의 최저 순위가 1인 경우 선언한 _rank dictionary에서 해당 순위를 찾지 못하므로 RuntimeError가 발생하기 때문에 실패한다. 

 

두 번째 시도

그러니 rank에 최저 순위가 1인 경우의 순위도 넣어줘서 처리했다. 사실 첫 번째 시도의 코드에서는 필요없는 부분도 존재하긴 한다. 그러니 다음과 같이 걷어내고 다시 제출했다.

def solution(lottos, win_nums):
    _rank = {
        6: 1,
        5: 2,
        4: 3,
        3: 4,
        2: 5,
        1: 6, # 추가된 부분
        0: 6
    }
    if sorted(lottos) == sorted(win_nums):
        return [1, 1]

    select_lottos = [x for x in lottos if x]
    select_zero = [0] * lottos.count(0)

    win_lottos = set(select_lottos).intersection(set(win_nums))

    min_rank = len(win_lottos)  # 최저
    max_rank = min_rank + len(select_zero)

    answer = [_rank[max_rank], _rank[min_rank]]
    answer.sort()

    return answer

 

728x90
반응형