[Python] 프로그래머스 lv1 - 로또 최고 순위와 최저 순위

2023. 12. 26. 17:07알고리즘/문제풀이

[Python] 프로그래머스 lv1 - 로또  최고 순위와 최저 순위

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

문제 설명
주어지는 입출력 형식

case 2에 대한 설명

 

  • lottos와 win_nums의 경우 6개의 숫자 배열
    • 등수 확인을 위해 dictionary를 사용하여 등수를 기입
  • 알아볼 수 없는 숫자는 0으로 표기 
    • 즉 알아볼 수 없는 숫자를 맞게 할 수도 틀리게 할 수도 있음
    • 최고 순위의 경우 기존의 숫자에서 맞는 경우 + 0으로 표기가 된 숫자의 경우를 더해서 등수를 출력
    • 최저 순위의 경우 기존 숫자에서 맞는 경우만 dictionary로 조회하여 출력

 

 

풀이 코드

 

  1. dictionary 선언
    1. 맞는 수와 등수를 가지고 있는 dictionary 선언
    2. 해당 dic에서 맞는 번호의 결괏값을 key로 넣어 등수를 가져올 예정
  2. lottos를 for 구문으로 순회 
    1. 순회 시 win_nums와 맞는 숫자가 있다면 cnt(맞는 숫자)를 +1
    2. 0이 lottos에 존재하면 해당 경우는 등수에 영향을 미치므로 0의 개수 체크
  3. 0으로 적힌 숫자와 맞는 숫자의 합은 최대 당첨순위의 경우, 맞는 숫자의 합으로는 최저 당첨순위의 합

 

예상 시간 복잡도 - O(n)

  • dictionary에서 조회 - O(1)
  • for loop - O(n)
def solution(lottos, win_nums):
    answer = []
    dic = {6:1,5:2,4:3,3:4,2:5,1:6,0:6} # 맞은 숫자의 갯수 : 등수
    cnt = 0
    cnt0= 0
    # 맞는 숫자의 갯수를 파악, 0으로 적힌 숫자도 파악
    for i in lottos:
        if i in win_nums:
            cnt+=1
        if i == 0:
            cnt0 +=1
    
    # 0으로 적힌 숫자와 맞는 숫자의 합은 최대 당첨순위의 경우, 맞는 숫자의 합으로는 최저 당첨순위의 합
    hope = cnt + cnt0

    return dic[hope], dic[cnt]