본문 바로가기

알고리즘 삽질장

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

반응형


문제설명

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

 

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

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

programmers.co.kr

사고과정

  • 이제 인프런 강의도 다 듣고 프로그래머스로 문제 유형을 사전에 확인하지 않고 실전 문제 풀이에 도전하고자 우선 프로그래머스 문제부터 도전했다.
  • 해당 문제를 풀 때, 그리디 방식으로 푸는 느낌이었다. 우선 알아볼 수 없는 숫자 0개를 제외하고 정답과 민수가찍은 번호가 공통인 숫자들 개수가 가장 최저 순위가 되었다. 그리고 숫자 0이 모두 다 맞춘 숫자였을 경우에 최고 숫자가 된다. 
  • 그런데 이를 좀 노가다? 방식스럽게 함수까지 따로 작성하면서 구현하긴 했다. 맞추긴 했는데 코드가 너무 장황한 듯 해서 다른 사람들 풀이를 참고했는데 매우 인상적인 풀이가 나왔다. 우선 0개수를 셀때 난 for loop를 사용하긴 했지만 count 함수를 사용하는 방법도 있었다. 그리고 순위를 결정하기 위해 get_score 이라는 함수를 새로 정의했는데, 간결한 코드 풀이는 리스트의 인덱스를 순위, 값을 맞춘 숫자 개수로 지정하고 정의했다..이 부분이 매우 인상적이었다.

풀이

- 나의 풀이

def get_score(nums):
    if nums == 6:
        return 1
    elif nums == 5:
        return 2
    elif nums == 4:
        return 3
    elif nums == 3:
        return 4
    elif nums == 2:
        return 5
    else:
        return 6


def solution(lottos, win_nums):
    common_nums = len(win_nums) - len(set(win_nums) - set(lottos))
    zero_nums = 0
    for l in lottos:
        if l == 0:
            zero_nums += 1

    answer = []
    min_nums = common_nums
    max_nums = common_nums + zero_nums
    answer.append(get_score(max_nums))
    answer.append(get_score(min_nums))
    
    return answer

- 간결한 풀이

def solution(lottos, win_nums):
    # index를 순위, value를 맞춘 숫자 개수
    rank = [6, 6, 5, 4, 3, 2, 1]
    
    zero_cnt = lottos.count(0)
    answer = 0
    
    for x in win_nums:
        if x in lottos:
            answer += 1
    
    return rank[zero_cnt + answer], rank[answer
반응형