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

goodidea·2022년 1월 5일
1

algorithm

목록 보기
2/3
post-thumbnail

문제

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

난이도

LEVEL 1

풀이

틀린 내용 지적 환영합니다

첫번째 풀이

코드

def solution(lottos, win_nums):
    grade = {6: 1, 5: 2, 4: 3, 3: 4, 2: 5, 1: 6, 0: 6}
    wins = set(win_nums)
    correct = 0
    zero = 0
    for lotto in lottos:
        if lotto in wins:
            correct += 1
        elif lotto == 0:
            zero += 1
    return [grade[correct + zero], grade[correct]]

아이디어

  • 로또 숫자는 중복되지 않으며, 찍은 번호와 로또 번호 순서는 상관 없이 찍은 번호가 로또 번호에 "포함"되기만 하면 됨 -> 포함여부 검사 복잡도가 낮은 set 이용
    • 포함여부 검사 시 시간 복잡도: 리스트는 O(n), 집합은 O(1)
  • 로또 순위에는 맞은 개수와 0의 개수가 결정적인 역할
  • 찍은 번호를 하나씩 순회하며 0일 경우를 카운트
  • 맞은 걸 틀리게 할 수는 없으므로 최저 순위는 0을 제외한 내가 맞은 번호들의 개수를 이용해 계산, 최고 순위는 0을 모두 정답으로 처리하였을 때 맞은 번호들의 개수를 이용해 계산
  • grade에는 맞은 개수(key): 순위(value)를 저장

복잡도

O(n)

소요 시간

10분 이내 (안 재봄)

채점결과


수정한 풀이

코드

def solution(lottos, win_nums):
    grade = [6, 6, 5, 4, 3, 2, 1]
    correct = len(set(win_nums) & set(lottos))
    zero = lottos.count(0)
    return [grade[correct + zero], grade[correct]]

복잡도

O(n)

아이디어

  • grade: 정답수가 0~6의 연속되는 정수로 한정되어 있음 -> 리스트의 인덱스를 정답수로 이용, 요소값은 순위
  • set을 사용한 김에 win_nums와 lottos를 교집합하여 정답개수 구하기(!!!)
  • zero는 별도 카운트

채점결과

profile
백엔드 꿈나무

0개의 댓글