๐Ÿ‘ฉ๐Ÿป‍๐ŸŒพ

[์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณ ๋“์  Kit/Python] ํž™(Heap) ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณ ๋“์  Kit/Python] ํž™(Heap)

์ฅฌ์Šค์ด 2023. 3. 14. 00:11
728x90
ํž™(heap)์ด๋ž€?

 

  • ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ์›์†Œ๋“ค์ด ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ์‚ญ์ œ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)
ํž™ ํ•จ์ˆ˜ ํ™œ์šฉํ•˜๊ธฐ

 

  • heapq.heappush(heap, item)
    • heap์— item์„ ์ถ”๊ฐ€
  • heapq.heappop(heap) 
    • heap์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ pop
    • ํž™์ด ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, IndexError๊ฐ€ ํ˜ธ์ถœ๋จ
  • heapq.heapify(x) 
    • ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ๋ฅผ heap์œผ๋กœ ๋ณ€ํ™˜

๋ฌธ์ œ ํ’€์ด

 

Q . ๋” ๋งต๊ฒŒ 

import heapq


def solution(scoville, K):
    answer = 0
    heapq.heapify(scoville)
    
    # ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด K๋ณด๋‹ค ํด ๋•Œ๋Š” ์„ž์„ ํ•„์š” X
    if scoville[0] >= K:
        return answer
    
    while scoville[0] < K:
        if len(scoville) == 1:	# ์›์†Œ๊ฐ€ 1๊ฐœ๋ผ ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋ชป ๋งŒ๋“ฆ
            return -1
        heapq.heappush(scoville, (heapq.heappop(scoville) + heapq.heappop(scoville) * 2))
        answer += 1
    return answer

Q . ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ

import heapq


def solution(jobs):
    heap = []
    answer, now, i = 0, 0, 0   
    s = -1
    
    while i < len(jobs):
        for j in jobs:
            if s < j[0] <= now:
            	# ์ž‘์—…์‹œ๊ฐ„ ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ์ด ์ž‘์—…์‹œ๊ฐ„ ์ตœ์†Œ๋จ
                heapq.heappush(heap, (j[1], j[0]))
        
        if heap:
            current = heapq.heappop(heap)
            s = now	# ์ž‘์—… ์ข…๋ฃŒ์‹œ๊ฐ„
            now += current[0]	# ํ˜„์žฌ ์ž‘์—…๊นŒ์ง€์˜ ์ž‘์—…์‹œ๊ฐ„ ๋ˆ„์ ๊ฐ’
            answer += now - current[1]	# ์š”์ฒญ์—์„œ ์ข…๋ฃŒ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„, current[1] = ์š”์ฒญ ๋“ค์–ด์˜จ ์‹œ๊ฐ„
            i += 1
        else:
            now += 1
        
    return answer // i

Q . ์ด์ค‘์šฐ์„ ์ˆœ์œ„ํ 

import heapq


def solution(operations):
    heap = []
    max_heap = []

    for i in operations:
        current = i.split()
        if current[0] == 'I':
            data = int(current[1])
            heapq.heappush(heap, data)
            # ์ตœ๋Œ€ ํž™ ๊ตฌํ˜„ ์œ„ํ•ด [์šฐ์„ ์ˆœ์œ„, ์‹ค์ œ๊ฐ’] ํ˜•ํƒœ๋กœ ์ €์žฅ
            heapq.heappush(max_heap, (data * -1, data))
        else:
            # heap ๋น„์–ด์žˆ์œผ๋ฉด ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๋‹ค์Œ ํ–‰๋™์„ ๊ณ„์†ํ•ด์„œ ์ง„ํ–‰
            if len(heap) == 0:
                pass
            # ์ตœ๋Œ“๊ฐ’ ์‚ญ์ œ
            elif current[1] == '1':
                max_value = heapq.heappop(max_heap)[1]
                heap.remove(max_value)
            # ์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ
            elif current[1] == '-1':
                min_value = heapq.heappop(heap)
                max_heap.remove((min_value * -1, min_value))

    if heap:
        return [heapq.heappop(max_heap)[1], heapq.heappop(heap)]
    else:
        return [0, 0]
728x90
Comments