[Programmers] 로또의 최고 순위와 최저 순위

suhyun·2021년 10월 10일
0

백준/프로그래머스

목록 보기
7/81

문제 링크

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

문제 풀이

1. set이용

def solution(lottos, win_nums):

    set_lottos = set(lottos)
    win_nums = set(win_nums)

    tmp = len(set_lottos & win_nums)
    if tmp < 2:
        if lottos.count(0) + tmp < 2:
            return [6, 6]
        else:
            return sorted([6,  7-(len(set_lottos & win_nums) + lottos.count(0))])

    else:
        return sorted([7 - tmp,  7-(len(
            set_lottos & win_nums) + lottos.count(0))])
  • set을 이용해서 lottos와 win_nums에서 동일한 숫자의 갯수 알아냄
  • 맞은 갯수가 2개 미만일 경우, 맞은 갯수와 0의 갯수를 합쳐도 2개 미만일 경우에서 예외가 발생해서 하나씩 예외 처리를 해줌
  • 더 효율적을 예외 처리하는 방법을 찾지 못함

2. set과 해시를 이용

def solution(lottos, win_nums):
     rank = {0: 6, 1: 6, 2: 5, 3: 4, 4: 3, 5: 2, 6: 1}
     return rank[len(set(lottos) & set(win_nums)) + lottos.count(0)], rank[len(set(lottos) & set(win_nums))]
  • 1번과 같이 set을 이용해 갯수 구함
  • 1번에서 하나씩 예외 처리 해주었던 부분이 해시를 이용하니깐 바로 해결됨

필요 개념

< 해시 Hash >

Python에서는 "딕셔너리"라는 자료구조를 통해 해시를 제공한다

언제 사용하면 좋을까

  • 리스트를 쓸 수 없을 때
    리스트는 인덱스를 사용해 접근이 가능하지만 인덱스의 값이 숫자가 아닌 문자열이나 튜플의 형태를 가질 경우 딕셔너리를 사용한다

  • 빠른 접근, 제거, 탐색이 필요한 경우
    딕셔너리의 시간복잡도는 대부분이 O(1)이기 때문에 빠른 처리가 가능하다

  • 집계가 필요한 경우
    원소의 개수를 세는 경우 해시, collections모듈의 Counter클래스를 사용하면 빠르게 해결할 수 있다.

후기

해시를 이용하는 방법을 구글링하면서 생각해내긴 했지만
왜 해시를 이용했을 때 예외 처리가 별도의 과정없이 바로 해결되는지 이해가 잘 안된다

profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글