알고리즘

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

파뱁 2022. 1. 4. 20:33
728x90

<문제 설명>

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

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

민우가 선택한 6개의 숫자와 당첨 숫자를 비교하는 문제이다.

6개의 숫자 중 일부는 알아볼 수 없게 되어, 정확하게 당첨 숫자와의 일치는 알수 없게 되었지만,

당첨이 가능했던 최고 순위와 최저 순위를 생각해 보는 것이 문제의 핵심이다.

 

입출력 예는 다음과 같다.

lottos win_nums result
[44, 1, 0, 0, 31, 25] [31, 10, 45, 1, 6, 19] [3, 5]
[0, 0, 0, 0, 0, 0] [38, 19, 20, 40, 15, 25] [1, 6]
[45, 4, 35, 20, 3, 9] [20, 9, 3, 45, 4, 35] [1, 1]

알아보지 못하는 수는 0으로 표현 되었고, 로또 특성상 같은 숫자는 한번만 배열에 등장한다.

 

<문제 해결 아이디어>

우선 정렬이 되어있지 않다고 나와있어서 python의 in, not in을 이용해서 숫자를 비교하기로 했다.

lottos에 있는 숫자 하나씩 win_nums에 있는지를 비교하는 함수를 만들고,

0이 있는 경우와 없는 경우로 분리하여 각 경우에 위 함수를 적용했다.

0이 없는 경우는 최고 득점과 최저 득점이 같으므로 위 함수를 한번만 사용했고,

0이 있는 경우에는 0을 고려 하지 않고 우선 함수를 사용한 뒤, 이를 최저 득점(최저 순위)로 저장했다.

최고 득점(순위)는 여기서 0이 모두 win_nums에 있는 숫자일 경우 이므로 최저 순위에 0의 갯수만큼 빼줬다.

(빼준 이유는 1순위가 제일 좋은 것이라 로또 숫자를 맞출때 마다 제일 안 좋은 순위로 부터 그 개수 만큼 빼주는 아이디어였기 때문이다.)

 

이 아이디어를 코드로 작성한 것이 아래의 풀이 코드 이다.

 

<문제 풀이 코드>

def solution(lottos, win_nums):
    answer = [] 
    cnt = 7 # 6순위가 1개일치 or 모두 불일치라서 초기값을 7로 잡고 7과 6을 동일하게 6으로 취급

    if 0 not in lottos:
        result = cntNums(cnt,lottos,win_nums)
        answer.append(result)
        answer.append(result)
    else:
        resultMin = cntNums(cnt,lottos,win_nums)
        zeroCnt = lottos.count(0)
        if zeroCnt == 6: # 모두 0일 경우 0순위라고 표기되는 오류를 해결하기 위해 넣음
            resultMax = 1
        else:
            resultMax = resultMin-zeroCnt
        answer.append(resultMax)
        answer.append(resultMin)
    
    return answer
def cntNums(cnt,lottos,win_nums): # 당첨 숫자가 얼마나 있는지 확인하는 함수
    for i in range(6):
        if lottos[i] in win_nums:
            cnt -= 1
    if cnt > 6:
        cnt = 6
    return cnt

채점 결과

728x90
반응형