본문 바로가기
알고리즘/프로그래머스

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

by 며루치꽃 2021. 5. 28.

문제

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

내가 생각했던 풀이과정

1. 일단 0의 갯수를 셉니다.

0의 갯수를 세어야하는 이유는 0의 숫자만큼 숫자가 지워졌을 때 두 가지 경우로 나눠지기 때문 입니다. 

1) 최선의 조건일 때는 0 대신에 로또 당첨 숫자에 맞는 숫자를 넣을 수 있습니다.

2) 최악의 조건일 때는 0 대신에 로또 당첨 숫자에 맞지 않는 숫자를 넣을 수 있습니다. 

 

2. 두번째로 0을 제외한 경우 맞은 갯수를 셉니다.

3. 

최선의 경우: 0의 갯수 대로 1) 조건일 때는 맞은 갯수에 0의 갯수를 더해줍니다.

최악의 경우: 0의 갯수와 상관없이 맞은 갯수가 그대로 당첨 숫자와 일치한 갯수가 되게 됩니다. 

4. 순위를 매겨야하기 때문에 rank에 [6, 6, 5, 4, 3, 2, 1] 배열을 만들어줍니다.

딕셔너리 형태도 고려를 해보았지만, 구조가 더 복잡하여 위와 같이 해결하였습니다.

6이 두번 들어간 이유는 인덱스 순위를 채우기 위함입니다.

 

5. rank[최선의 수], rank[최악의 수] 를 반환하여 결과를 반환합니다.

나의 풀이

def solution(lottos, win_nums):
    # rank = {1:6, 2:5, 3:4, 4:3, 5:2, 6:1}
    rank = [6, 6, 5, 4, 3, 2, 1]
    answer = []
    count = 0
    zeroCount = 0
    for k in lottos:
        if k == 0:
            zeroCount += 1

    for i in range(len(win_nums)):
        for j in range(len(lottos)):
            if lottos[i] == win_nums[j]:
                count += 1
    best = count + zeroCount
    
    return rank[best], rank[count]

다른 사람의 풀이

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]

count( ) 함수를 이용해 0의 갯수를 저장해주고, for 문을 2번 쓰는 대신 in 함수를 사용해 코드의 길이를 줄였습니다. 

좀 더 깔끔해보이는 것 같습니다.

 

새로 알게된 점, 확인해야할 점

count(찾고자하는 요소): 값이, 리스트에 몇개나 들어있는지 확인하고자 할때, 리스트 뒤에 점( . )을 찍고 count() 함수에 원하는 값을 넣어주면 된다.

 

찾고자하는 요소에는 문자열이 들어가도 상관없다.

 

댓글