출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.
섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
scoville | K | return |
---|---|---|
[1, 2, 3, 9, 10, 12] | 7 | 2 |
입출력 예 설명
스코빌 지수가 1인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.
모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.
def solution(scoville, K):
"""
- param scoville : 음식의 스코빌 지수를 담은 배열 (List)
- param K : 스코빌 지수 임계치 (Int)
- return : 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수 (Int)
"""
import heapq
heapq.heapify(scoville)
cnt = 0
while True :
min1 = heapq.heappop(scoville)
min2 = heapq.heappop(scoville)
if min1 >= K :
break
cnt += 1
heapq.heappush(scoville, min1 + min2*2)
if len(scoville) <= 1 :
return -1
return cnt
풀이 방법
1) heapq.heapify
로 scoville을 heap구조로 만들며, 정렬된 상태로 저장
2) heapq.heappop
으로 scoville에서 가장 작은 2개의 음식을 삭제하며 별개로 저장
3) heapq.heappush
로 새로 만든 음식을 soville에 추가하며, 동시에 정렬
4) scoville의 최소값이 K이상이면 반복문을 멈추며, 음식을 계속 만들어서 1개로 합쳐지더라도 K이상이 되지 않으면 -1로 반환
import heapq
def mix(first,second):
return first+ second*2
def bfs(scoville,K):
successFlag = False
count = 0
while len(scoville)>=1:
first = heapq.heappop(scoville)
if first > K:
successFlag = True
break
if len(scoville)>=1:
second = heapq.heappop(scoville)
mixResult = mix(first,second)
heapq.heappush(scoville, mixResult)
count+=1
if successFlag:
return count
else:
return -1
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
answer = bfs(scoville,K)
return answer
출처 : https://minnnne.tistory.com/4
힙(heap)이 가장 유용한 경우는 전체를 정렬하는 것이 아니라 가장 큰 값(or 가장 작은 값) 몇개만 필요할 때인 것 같다.
Heap에 대해 잘 설명된 블로그를 공유합니다~