[프로그래머스 Lv.1] – 로또의

(문제 설명)

로또 6/45(이하 “로또”라 함)는 1부터 45까지의 숫자 6개가 일치하는 대표적인 복권입니다.

다음은 복권 순위 결정 방법입니다.

하나

랭킹 우승 내역

하나 숫자 6개 모두 일치
2 숫자 5개 일치
숫자 4개 일치
4 숫자 3개 일치
5 숫자 2개 일치
6 (잃어버린)

복권을 산 민우는 당첨번호가 발표되기를 기다렸다.

그런데 민우의 남동생이 로또에 낙서를 하고 숫자를 지웠다.

당첨 번호가 발표된 후 민우는 자신이 구매한 복권으로 당첨될 수 있었던 최고 순위와 최저 순위를 알아보고자 했습니다.


알 수 없는 번호 나는 그것을 0으로 표시하기로 했고 민우가 산 로또 번호 6개를 예를 들어 44, 1, 0, 0, 31 25. 당첨 번호 6개 31, 10, 45, 1, 6, 19인 경우 가능한 최대 및 최소 승리의 예는 다음과 같습니다.

당첨번호 3110451619 결과

최고 순위 번호 31 0→10 44 하나 0→6 25 숫자 4개 일치, 3승
최하위 번호 31 0→11 44 하나 0→7 25 숫자 2개 맞추기, 5등
  • 순서와 관계없이 구매한 복권에 당첨 번호와 일치하는 번호가 있으면 정답으로 인정합니다.

  • 인식할 수 없는 두 숫자가 각각 10과 6이고 3등을 받을 수 있다고 가정합니다.

    • 3등을 할 수 있는 다른 방법이 있습니다.

      그러나 2위를 넘기는 것은 불가능하다.

  • 인식할 수 없는 두 숫자가 각각 11과 7이라고 가정하면 5등에 당첨될 수 있습니다.

    • 5위를 얻는 다른 방법이 있습니다.

      단, 6등(추첨)은 불가합니다.

민우가 구매한 로또번호 배열 lotto와 당첨번호 배열 win_nums가 파라미터로 주어진다.

이 시점에서 solve 함수를 완성하여 배열에서 가능한 최고 및 최저 승 순위를 정렬하고 반환합니다.

(제한)

  • lottos는 길이가 6인 정수 배열입니다.

  • Lotto의 모든 요소는 0보다 크고 45보다 작은 정수입니다.

    • 0은 인식할 수 없는 숫자를 의미합니다.

    • 복권에서 0 이외의 숫자는 두 번 이상 사용되지 않습니다.

    • 추첨 요소는 정렬되지 않을 수 있습니다.

  • win_nums는 길이가 6인 정수 배열입니다.

  • win_nums의 모든 요소는 1보다 크거나 같고 45보다 작거나 같은 정수입니다.

    • win_nums에는 동일한 숫자가 두 개 이상 포함되지 않습니다.

    • win_nums의 요소는 정렬되지 않아야 합니다.

(카누 코드)

def solution(lottos, win_nums):
    max = 7 - len(set(lottos)& set(win_nums))
    max = 6 if max >=6 else max
    if 0 in lottos:
        min = max - lottos.count(0)
    else:
        min = max
    min = 1 if min ==0 else min
    answer = (min,max)
    return answer

1. 7에서 내가 선택한 숫자와 정답의 교점의 요소수 빼기 -> 순위 추출

1-1 1 또는 0을 맞추는 사람은 6번이므로 이 경우를 해결하십시오.

2. 숨겨진 숫자가 있는 경우 -> 숨겨진 숫자가 모두 맞으면 최상 => 해당 숫자만큼 위로 이동

2-1 그렇지 않다면 다음과 같이 순위를 매긴다.

2-2 0이 6이면 1이 나와야 하는데 0이 출력되니까 그 경우 처리

(다른 코드)

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)

정답을 사람이 제공한 숫자와 비교하면서 ANS를 높입니다.

순위를 순위로 지정하면 0과 ANS의 숫자를 조합하여 최대/최소 순위를 생성합니다.

예외적인 경우를 구별하는 것보다 이 방법이 더 쉽다고 생각합니다.