📃 문제 링크
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
제한 사항
입출력 예
scoville | K | return |
---|---|---|
[1, 2, 3, 9, 10, 12] | 7 | 2 |
먼저 리스트 scoville
을 heapify
함수를 사용해 힙으로 만들어준다. (기본적으로 최소 힙)
가장 첫 번째 원소, 즉 scoville[0]
은 항상 힙의 루트 노드로 최솟값이기 때문에 scoville[0]
이 K
보다 크거나 같아질 때까지 반복문을 돌려준다.
pop
을 하지 않고 인덱스로만 비교해준다면 두 번째로 작은 값을 찾기 위해 세 번째 값까지 비교해야 하지만, 이 문제에서는 최솟값 2개를 뽑아 다시 push
해주는 방식이기 때문에 간단하게 풀 수 있다.
가장 작은 값, 두 번째로 작은 값을 찾기 위해 pop
을 두 번 해주고, 문제에서 제공한 공식을 적용한 값을 push
해준다. 한 번 섞은 것이므로 answer
를 하나 올려준다.
스코빌 지수를 K
이상으로 만들 수 없는 경우는 모두 섞어서 음식이 하나 남았는데도 그 음식의 스코빌 지수가 K
보다 작은 경우이므로 if
문으로 걸러준다.
Python
의 heapq
모듈import heapq
# 최소 힙 생성, push
heap_list = []
heapq.heappush(heap_list, 4)
heapq.heappush(heap_list, 1)
heapq.heappush(heap_list, 7)
# pop
heapq.heappop(heap_list)
# pop하지 않고 최솟값 얻기
print(heap_list[0])
# 기존 리스트를 힙으로 변환
a_list = [4, 1, 7, 3, 8, 5]
heapq.heapify(a_list)
heappop()
을 통해 최솟값을 삭제한 후 heap[0]
로 접근하는 방법을 사용하거나, 인덱스 1을 인덱스 2와 비교하는 방법을 사용해야 한다.