[프로그래머스] 로또의 최고 순위와 최저 순위

zunzero·2022년 8월 27일
0

알고리즘(파이썬)

목록 보기
41/54

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

로또 번호 6자리 중, 낙서로 인해 지워진 번호는 0으로 표기된다.
알고자 하는 것은 해당 로또 번호의 최고와 최저 순위이다.
즉, 0으로 표시된 번호가 다 당첨이었을 경우와 0으로 표시된 번호가 모두 당첨이 아닐 경우의 순위를 각각 구하는 문제이다.

구현이 어렵지 않았고, 실제로 어렵지 않게 풀었다.
다만, 더 좋은 소스코드를 2개 발견해서 첨부하고자 한다.

우선 내가 작성한 코드

def solution(lottos, win_nums):
    answer = []
    # 당첨된 번호 개수
    count = 0
    # 0으로 표시된 번호 개수
    zero = 0
    for lotto in lottos:
        if lotto == 0:
            zero += 1
        if lotto in win_nums:
            count += 1
    print(count, count+zero)
    
    # 0으로 적힌 번호가 당첨이라고 가정한 경우의 순위
    answer.append(7-(count+zero))
    # 0으로 적힌 번호가 당첨이 아니라고 가정한 경우의 순위
    answer.append(7-count)

    # 그 외 처리 (0개 맞았을 때)
    if answer[0] >= 7:
        answer[0] = 6
    if answer[1] >= 7:
        answer[1] = 6
    # answer.sort()
    return answer

어렵지 않은 문제였기 때문에 그냥 닥치는 대로, 생각나는 대로 작성한 소스 코드이며 가독성이 그리 좋다거나 하지는 않다.

def solution(lottos, win_nums):
    rank = {
        0: 6,
        1: 6,
        2: 5,
        3: 4,
        4: 3,
        5: 2,
        6: 1
    }
    return [rank[len(set(lottos) & set(win_nums)) + lottos.count(0)], rank[len(set(lottos) & set(win_nums))]]

개인적으로 가장 마음에 들었던 코드로, set 자료형을 이용했다.
굉장히 가독성이 좋다고 생각이 든다.

def solution(lottos, win_nums):

    rank=[6,6,5,4,3,2,1]

    cnt_0 = lottos.count(0)
    ans = 0
    for x in win_nums:
        if x in lottos:
            ans += 1
    return rank[cnt_0 + ans],rank[ans]

굉장히 간결하면서 직관적인 코드이다.

세상엔 참... 좋은 개발자들이 많은 것 같다.

profile
나만 읽을 수 있는 블로그

0개의 댓글