

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42626
scoville 이라는 숫자가 들어있는 배열을 입력 받고,
스코빌 지수 K를 입력받는다.
Leo라는 사람은 scovile 안에 숫자를 합쳐서 모든 숫자가 K 이상으로 만들고 싶다.
숫자를 합치는 방식은 이렇다.
A 가장 값이 낮은 숫자를 하나 뽑고,
B 그다음 낮은 값의 숫자 하나 뽑은뒤 2를 곱한다.
A * 2B 를하면 숫자를 합칠 수 있다.
모든 숫자가 K이상이 될때 몇번 숫자를 합쳐야하는 지를 return 하는 문제
최솟값들을 뽑아내야 하니 파이썬에서는 heapq 라이브러리를 쓰면 편하다.
heapq.heappop() 메소드를 사용하면 heapq 배열 안에 최솟값을 뽑아준다.
import heapq
def solution(scovile, K):
heapq.heapify(scovile) # scovile 배열을 heap 자료구조로 변환
cnt = 0
# 힙의 최솟값이 K 이상이 될 때까지 섞기
# 매번 2개를 꺼내야 하므로 len(scovile) >= 2 조건도 함께 확인
while len(scovile) >=2 and scovile[0] < K: # heap구조에서는 [0]이 최솟값임
min_s = heapq.heappop(scovile)
next_min_s = heapq.heappop(scovile)
new_s = min_s + (next_min_s * 2)
heapq.heappush(scovile,new_s)
cnt += 1
if len(scovile) > 0 and scovile[0] >= K:
return cnt
else:
return -1
나의 답은 이 코드였는데 더 좋은 코드가 있어서 가져와본다.
import heapq as hq
def solution(scoville, K):
hq.heapify(scoville)
answer = 0
while True:
first = hq.heappop(scoville)
if first >= K:
break
if len(scoville) == 0:
return -1
second = hq.heappop(scoville)
hq.heappush(scoville, first + second*2)
answer += 1
return answer
이 코드는 while True와 break을 써서 최소값이 K 이상인지를 확인한 후 return answer로 바로 넘어가게 해줬고,
len(scovile)이 -이면 바로 return -1 처리를 해주었다.
나도 다음에 while True, break, 얼리리턴을 적용해봐야겠다.