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

chanyeong kim·2021년 9월 15일
0

프로그래머스

목록 보기
1/51

📩 -->문제설명

로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.....

당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요!

제한사항

  • lottos는 길이 6인 정수 배열입니다.
  • lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
    - 0은 알아볼 수 없는 숫자를 의미합니다.
    - 0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.
    - lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.
  • win_nums은 길이 6인 정수 배열입니다.
  • win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
    - win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.
    - win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.

입출력 예

lottoswin_numsresult
[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]

조건

순위당첨 내용
16개 번호가 모두 일치
25개 번호가 일치
34개 번호가 일치
43개 번호가 일치
52개 번호가 일치
6그 외

💡 solution(사용언어: python)

def solution(lottos, win_nums):
    answer=[]
    cnt=0
    zero = lottos.count(0)
    rank = {6:1,5:2,4:3,3:4,2:5,1:6,0:6}
    mx = 0
    mn = 0
    if zero ==0:
        for i in lottos:
            for j in win_nums:
                if i==j:
                    cnt+=1
        answer = [rank[cnt], rank[cnt]]
        return answer
    else:
        for i in lottos:
            for j in win_nums:
                if i==j:
                    cnt+=1
        mn = cnt
        mx = cnt+zero
        answer = [rank[mx], rank[mn]]
        return answer

👉 설명

answer: 최고 순위와 최저 순위를 담는 리스트
zero: 로또 번호 중 0의 개수
mx: 제일 많이 일치하는 개수
mn: 제일 적게 일치하는 개수

  1. 로또 번호 중에서 0이 들어가 있지 않다면 (번호가 지워지지 않았다면), 로또 번호와 정답을 바로 비교해 줄 수 있기 때문에 다음과 같이 코드를 짰다.
    if zero ==0:
        for i in lottos:
            for j in win_nums:
                if i==j:
                    cnt+=1
        answer = [rank[cnt], rank[cnt]]
        return answer
  1. 로또 번호 중 0이 있다면(, 먼저 0을 제외하고 로또 번호와 정답 번호가 같은 번호의 개수를 cnt에 넣어준다.
  2. 최고 순위가 되려면 가려져 있는 번호(zero)가 모두 당첨번호와 동일해야 하기 때문에 mx = cnt + zero가 되어야 한다.
  3. 최저 순위가 되려면 가려져 있는 번호(zero)가 모두 당첨번호와 동일하지 않아야 하기 때문에 mn = cnt가 된다.
  4. 미리 정의해 놓았던 순위(rank)에서 mx와 mn 번째를 각각 출력해준다.
        for i in lottos:
            for j in win_nums:
                if i==j:
                    cnt+=1
    
        mn = cnt
        mx = cnt+zero
        answer = [rank[mx], rank[mn]]
        return answer

결과

다른 풀이

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]

🌈 느낀 점

그렇게 어렵지 않은 문제였으나, 일단 직관적으로 빨리 코드를 짜버리려는 습관 때문에 코드가 길게 나온 것 같다........

코드를 간결하게 짜려는 습관을 길러봐야겠다!

출처: 프로그래머스

0개의 댓글