본문 바로가기
Algorithm

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

by seungh2 2022. 6. 16.

프로그래머스 <로또의 최고 순위와 최저 순위>

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

 

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

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

programmers.co.kr


로또의 최고 순위와 최저 순위

민우가 산 로또 번호와 로또 당첨 번호가 주어졌다. 이때, 민우가 산 로또 번호 중에 일부가 지워졌다. 이런 숫자는 0으로 들어온다. 0으로 들어온 번호를 임의로 정할 때, 가장 높은 등수와 가장 낮은 등수를 구하여라.


문제해결

민우가 산 로또 번호 lottos와 로또 당첨 번호 win_nums가 들어온다.

 

  • 먼저 둘 다 정렬을 해준다.
  • lottos에서 0이 몇 개인지 세준다. 0이 아닌 숫자가 처음으로 나오는 index를 idx에 저장한다.
  • win_nums 크기 만큼 for문을 돌려서  lottos의 idx 부터 비교를 한다.
    • 만약 lottos[idx]와 win_nums[i]가 같다면 same을 count하고 idx에 1을 더한다.
    • 만약 lottos[idx]가 win_nums[i]보다 작다면 
      • idx에 1을 더하고 while문을 돌려 lottos에서 해당 win_nums[i]보다 큰 값을 찾는다.
      • 이때 win_nums[i]와 같다면 same을 count 하고 idx에 1을 더한다. 
      • while문을 멈추는 조건은 win_nums[i]와 같거나 lottos의 값이 더 클 경우, idx값이 6일 경우이다.

등수를 구하는 방법은 아래와 같다.

6 - 같은 숫자의 개수 + 1이다. 이때 값이 5보다 크다면 모두 6을 출력하면 된다.

0의 값은 내가 마음대로 조절할 수 있기 때문에 최저 등수는 안 맞게 하면 되고 최고 등수는 당첨 번호와 맞게 하면 된다. 따라서 6 - (같은 숫자의 개수 + 0의 개수) + 1이 된다.

 

예시

zero = 1
[1, 3, 18, 20, 25, 39]
[0, 3, 9, 16, 30, 39]

idx = 1
1 < 3 -> none
3 = 3 => same = 1, idx = 2
18 > 9 -> idx = 3 while문. 18 > 16 -> idx = 4
18 < 30 -> break
20 < 30 -> none
25 < 30 -> none
39 > 30 -> idx = 5 while문. 39 = 39-> same = 2

코드

def solution(lottos, win_nums):
    lottos = sorted(lottos)
    win_nums = sorted(win_nums)
    zero = 0
    idx = 0
    same = 0;
    for l in range(6):
        if lottos[l] == 0:
            zero+=1
        else:
            idx = l
            break
    for i in range(6):
        if idx == 6:
            break
        if win_nums[i] == lottos[idx]:
            same+=1
            idx+=1
        elif win_nums[i] > lottos[idx]:
            idx += 1
            while True:
                if idx== 6:
                    break
                if win_nums[i] > lottos[idx]:
                    idx+=1
                elif win_nums[i] == lottos[idx]:
                    same+=1
                    idx+=1
                    break
                else:
                    break
            
    min_rank = 6 - same + 1
    max_rank = 6 - (same + zero) + 1
    answer = [0, 0]
    if min_rank > 5:
        answer[1] = 6
    else:
        answer[1] = min_rank
    
    if max_rank > 5:
        answer[0] = 6
    else:
        answer[0] = max_rank
    return answer

결과


 

728x90

'Algorithm' 카테고리의 다른 글

백준 11576번 <Base Conversion>  (0) 2022.06.20
백준 2745번 <진법 변환>  (0) 2022.06.17
백준 17103번 <골드바흐 파티션>  (0) 2022.06.15
백준 2089번 <-2진법>  (0) 2022.06.14
백준 1744번 <수 묶기>  (0) 2022.06.10

댓글