Programmers, 더 맵게
TL;DR
- 힙(heap)
문제 요약
1. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 갖고 있는 음식을 섞어서 스코빌 지수를 늘리려고 한다.
2. 갖고 있는 음식 중 스코빌 지수를 가장 낮은 두 개의 음식을 아래와 같은 방법으로 섞어 새로운 음식을 만든다.
`섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째 맵지 않은 음식의 스코빌 지수 * 2)`
3. 갖고 있는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞는다.
- 보유 하고 있는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 스코빌 지수가 가장 낮은 2개 음식을 뽑아 주어진 공식에 맞게 섞는 것을 반복하면 된다.
- 파이썬에서는 힙(heap)이 최소 힙(min heap)으로 구현되어 있어 가장 낮은 스코빌 지수를 추출해내는데 유용하게 활용할 수 있다.
입출력 형태
풀이
import heapq
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
while True:
try:
least = heapq.heappop(scoville)
# 최소인 값이 K보다 클 경우 나머지 값들 모두 K보다 크다는 성질을 이용
if least >= K:
return answer
less = heapq.heappop(scoville)
new = least + (less * 2)
heapq.heappush(scoville, new)
answer += 1
except IndexError:
return -1
주어진 리스트를 힙으로 만들어 준다. 파이썬의 `heapq` 모듈에는 `heapify`라는 메소드가 있는데 이는 파라미터로 주어지는 자료를 최소 힙 구조로 만들어 준다. 이 구문이 실행되고 나면 scoville는 최소 힙 구조를 갖게 된다.
그 다음은 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하면 된다.
만약 뽑은 최소 음식의 스코빌 지수가 K 이상일 경우는 다른 모든 음식들의 스코빌 지수가 K 이상이다. 왜냐하면 최소 힙이기 때문에 추출하는 값이 존재하는 값 중에 최소이기 때문이다.
따라서 코드에서도 최소로 뽑은 값이 K 이상일 경우는 정답을 반환하고 종료한다.
만약 최소로 뽑은 값이 K보다 작을 경우는 문제에서 주어진 공식에 따라서 스코빌 지수를 만들면 된다. 이 때, 이 구문을 try로 감싼 이유는 모든 음식의 스코빌 지수가 K보다 작을 경우는 힙이 비게 된다. 그래서 에러가 발생하게 된다. 이 때는, 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우이므로 -1을 반환하고 종료한다.
최소 힙의 성질을 이용해서 문제를 해결하면 된다.
반응형
'개발 > Algorithm' 카테고리의 다른 글
[프로그래머스] 가장 큰 수(python) (0) | 2021.09.27 |
---|---|
[프로그래머스] 소수 찾기(python) (0) | 2021.09.23 |
[리트코드] Kth Largest Element in an Array(python) (0) | 2021.08.30 |
[리트코드] Balanced Binary Tree(python) (0) | 2021.08.22 |
[리트코드] Serialize and Deserialize Binary Tree(python) (0) | 2021.08.20 |