알고리즘(Python) - 더 맵게


Input

1
2
scoville = [1, 2, 3, 9, 10, 12]
K = 7

Expected Output

1
return = 2

목표

  • 모든 음식의 스코빌 지수를 K 이상으로 만드는 것
  • 위의 목표를 이루기 위해 하는 작업

    • (섞은 음식의 스코빌 지수) = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
  • 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복

  • 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return하는 함수를 작성

조건

  • 1 <= length(scoville) <= 1,000,000
  • 0 <= K <= 1,000,000,000
  • 0 <= each element of scoville <= 1,000,000
  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return

코드

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import heapq

def solution(scoville, K):
heap = []
count = 0
[heapq.heappush(heap, i) for i in scoville]

while(K > heap[0]):
smallest, second_smallest = heapq.heappop(heap), heapq.heappop(heap)
heapq.heappush(heap, smallest + (second_smallest * 2))
if len(heap) == 1 and K > heap[0]:
return -1
count += 1

return count

해설

  • 항상 배열의 정렬을 유지하는 힙을 이용한다.
  • 가장 작은 스코빌과 두 번째로 작은 스코빌을 뽑아내어 새로운 스코빌을 만든다.
  • 만약 배열에 원소가 하나만 남고 그 원소마저 K 보다 작다면 -1을 리턴한다.
  • 위의 상황이 아니라면 count를 늘린다.
  • while 루프는 가장 작은 스코빌이 K 보다 작은지 점검한다.
  • 만약 가장 작은 스코빌이 K 보다 크다면 루프에 진입하지 않고 count를 리턴한다.