[프로그래머스] 더 맵게 | 파이썬 Python | 힙(heapq)

문제

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • scoville의 길이는 2 이상 1,000,000 이하입니다.
  • K는 0 이상 1,000,000,000 이하입니다.
  • scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.

 

예제

etc-image-0

  1. 스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 1 + (2 * 2) = 5
    가진 음식의 스코빌 지수 = [5, 3, 9, 10, 12]
  2. 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
    새로운 음식의 스코빌 지수 = 3 + (5 * 2) = 13
    가진 음식의 스코빌 지수 = [13, 9, 10, 12]

모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.

 

나의 풀이

from collections import deque

def solution(scoville, K):
    queue = deque(sorted(scoville, reverse=True))
    cnt = 0
    
    while queue[-1] < K:
        if len(queue) >= 2:
            cnt += 1
            a = queue.pop()
            b = queue.pop()
            queue.append(a + (b * 2))
            queue = sorted(queue, reverse=True)
        else:
            break
            
    return cnt if queue[0] >= K else -1
  • deque()를 사용해서 풀었는데 정확성 테스트는 통과했지만 효율성 테스트는 모두 시간 초과가 발생했다.

 

다른 사람의 풀이 (heapq)

import heapq

def solution(S, K):
    cnt = 0
    heapq.heapify(S)
    
    while S[0] < K:
        if len(S) >= 2:
            cnt += 1
            a = heapq.heappop(S)
            b = heapq.heappop(S)
            heapq.heappush(S, a + (b * 2))
        else:
            cnt = -1
            break
   
    return cnt
  • heapq는 리스트를 최소 힙처럼 다룰 수 있도록 도와주는 모듈로, heapq. heappush()를 실행하면 리스트가 자동으로 오름차순 정렬이 되고, heapq. heappop()을 실행하면 힙에서 가장 작은 값이 제거된다.
  • 다만 리스트가 자동 정렬되도록 하려면 heapq.heapify()를 실행해서 리스트를 힙 구조로 변환해야 한다. 그냥 리스트에 바로 heapq.heappush()로 요소를 추가하면 정렬되지 않고 리스트의 끝에 추가된다.

 

회고

  • 문제를 읽고 가장 먼저 어떤 자료구조가 맞을지 고민하는 시간을 가져야겠다.
  • 자료구조별로 어떤 장점을 가지는지도 문제를 계속해서 풀다보면 감이 오겠지.