๐Ÿงฉ Problem Solving/[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] 42626 ๋” ๋งต๊ฒŒ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2023. 8. 25. 19:56
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


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๊ฐ’์„ ์ถœ๋ ฅํ•ด ์ฃผ๋ฉด ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋‹ต์ด ๋œ๋‹ค.