heap์ ์ด์ฉํ๋ ๋ฌธ์ . ๋๊ฒ ์ค๋๋ง์ ํ์ด๋ณธ ์ ํ์ด๋ผ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉฐ ์ธ์ heap์ ์ฐ๋ ๊ฒ ์ข์์ง ์ฐ์ตํด์ผ๊ฒ ๋ค.
์์ด๋์ด
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด scoville๋ฆฌ์คํธ์์ ๊ณ์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ์์ return ํด์ผ ํ๋ค.
min() ๋ฉ์๋์ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค. ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฆฌ์คํธ์ ๊ธธ์ด ์ต๋๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ์ข ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
heap์ ์ด์ฉํด์ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ฉด ์๊ฐ์ ๋จ์ถํ ์ ์๋ค. heappop์ ์๊ฐ ๋ณต์ก๋๋ O(logN)์ด๋ค.
์ ์ฒด ์ฝ๋
import heapq
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
while True:
first = heapq.heappop(scoville)
if first >= K:
break
if len(scoville) <= 0:
answer = -1
break
second = heapq.heappop(scoville)
new_food = first + second * 2
answer += 1
heapq.heappush(scoville, new_food)
return answer
์ฝ๋ ์ค๋ช
heapq.heapify(scoville)
์ผ๋จ heapifyํจ์๋ฅผ ์ฌ์ฉํด scoville ๋ฆฌ์คํธ๋ฅผ heap์ผ๋ก ๋ณํํด ์ฃผ์.
while True:
first = heapq.heappop(scoville)
if first >= K:
break
if len(scoville) <= 0:
answer = -1
break
heappop์ ํตํด scoville์์ ๊ฐ์ฅ ์์ ๊ฐ์ return ํด์ค๋ค.
๋ฌธ์ ์กฐ๊ฑด์์ ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๊ฐ K๋ฅผ ๋๋์ง ํ์ธํด์ผ ํ๋ค. ์ฆ, ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์์ ๊ฐ๋ง ๋น๊ตํด ๋ด๋ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์์์ ์ค์ฝ๋น ์ง์๊ฐ K์ด์์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ๋ -1์ ์ ๋ต์ผ๋ก ์ถ๋ ฅํ๋ผ๊ณ ์๊ตฌํ๋ค.
์ด ๋ง์ ์กฐํฉ์ ๊ณ์ํด์ scoville๋ฆฌ์คํธ๊ฐ ๋น๋ค๋ฉด -1์ ์ถ๋ ฅํด ์ฃผ๋ฉด ๋๋ค.
second = heapq.heappop(scoville)
new_food = first + second * 2
answer += 1
heapq.heappush(scoville, new_food)
์์ ๋ ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์์๋ค๋ฉด ์๋ก์ด ์์ ์กฐํฉ์ ์ํด heappop์ผ๋ก ๊ฐ์ฅ ์์ ๊ฐ(๋ ๋ฒ์งธ๋ก ์์ ๊ฐ)์ ๋ฝ์์ฃผ์.
๋ฌธ์ ์์ ์ฃผ์ด์ ์์ผ๋ก ์ค์ฝ๋น์ ๊ณ์ฐํ๊ณ , ์์ ํ์ answer += 1์ ํด์ค๋ค.
์๋ก ๋ง๋ ์์์ heappush๋ฅผ ํตํด scoville ๋ฆฌ์คํธ์ ์ฝ์ ํด ์ค๋ค.
๋ง์ง๋ง์ผ๋ก answer๊ฐ์ ์ถ๋ ฅํด ์ฃผ๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ ๋ต์ด ๋๋ค.