BOJ/๐Ÿฅˆ

โ˜…PQ ์ค‘์ƒ๊ธ‰ - 6๋ฌธ์ œ()โ˜…

metamong 2023. 1. 11.

๐Ÿง  priority queue๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ heap ๊ด€๋ จ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋Š” ๊ธฐ์กด ์ž๋ฃŒ๊ตฌ์กฐ(stack, queue, deck)๋ณด๋‹ค ๋” ๋ณต์žกํ•œ tree๊ตฌ์กฐ๋กœ, ์ค‘๊ธ‰ ์ดํ•˜์˜ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ์ค‘์ƒ๊ธ‰ ์ด์ƒ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉฐ ์ ์‘ํ•ด๋ณด์ž

 

๐Ÿง  priority queue ๊ด€๋ จ ๊ฐœ๋… ํฌ์ŠคํŒ… ์ฐธ๊ณ 

 

priority queue - (binary) heap tree

1. concepts> โ˜๏ธ ์šฐ์„ ์ˆœ์œ„ ํ = '์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ' โ˜๏ธ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ ex) ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๊ฐ€

sh-avid-learner.tistory.com


โ˜… 1927 ์ตœ์†Œ ํž™ โ˜…

 

import sys
import heapq
input=sys.stdin.readline

N=int(input())
arr=[]
heap=[]

for _ in range(N):
    x=int(input())
    if x>0:
        heapq.heappush(heap,x)
    else:
        if len(heap)>0:print(heapq.heappop(heap))
        else:print(0)

 

 

๐Ÿง  heapq library๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ heap ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋จ

 

โ‘  x๊ฐ€ ์ž์—ฐ์ˆ˜๋ผ๋ฉด(x>0) heappush()๋ฅผ ์‚ฌ์šฉํ•ด list๋กœ ๊ตฌํ˜„ํ•œ heap์— x๋ฅผ ์ง‘์–ด๋„ฃ๋Š”๋‹ค

โ‘ก x๊ฐ€ 0์ด๋ผ๋ฉด, heap์— element๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ heappop()์œผ๋กœ ๋ฝ‘์€ ๋’ค, ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์ถœ๋ ฅ! ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅ

 

๐Ÿง  python์˜ heapq๋Š” min-heap์— ๋งž์ถ”์–ด์ ธ ์žˆ๋‹ค.

 


โ˜… 11279 ์ตœ๋Œ€ ํž™ โ˜…

 

import sys
import heapq
input=sys.stdin.readline

N=int(input())
arr=[]
heap=[]

for _ in range(N):
    x=int(input())
    if x>0:
        heapq.heappush(heap,-x)
    else:
        if len(heap)>0:print(-heapq.heappop(heap))
        else:print(0)

 

 

๐Ÿง  ์œ„ 1927 ์ตœ์†Œ ํž™ ์ฝ”๋“œ์—์„œ heappush์— ๋“ค์–ด๊ฐ€๋Š” value์— -๋ฅผ ๋ถ™์ด๊ณ , heappop์œผ๋กœ ๋‚˜์˜ค๋Š” value์— -๋ฅผ ๋ถ™์ด๋ฉด ๋!


โ˜… 14235 ํฌ๋ฆฌ์Šค๋งˆ์Šค ์„ ๋ฌผ โ˜…

 

import sys
import heapq
input=sys.stdin.readline

n=int(input())
heap=[]

for _ in range(n):
    a=list(map(int,input().split()))
    l=len(a)
    if l>1:
        for i in range(1,l):
            heapq.heappush(heap,-a[i])
    else:
        if len(heap)>0:print(-heapq.heappop(heap))
        else:print(-1)

 

๐Ÿง  ์„ ๋ฌผ์„ ์ฃผ๋˜, ๊ฐ€์žฅ ๊ฐ€์น˜๊ฐ€ ํฐ ์„ ๋ฌผ ๋จผ์ € ์ค˜์•ผ ํ•˜๋ฏ€๋กœ, ๋‹จ์ˆœํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ, ์šฐ์„ ์ˆœ์œ„ ๊ฐ€ ์žˆ๋Š” ์šฐ์„ ์ˆœ์œ„ queue heap ๊ตฌ์กฐ ์‚ฌ์šฉ!


โ˜… 23757 ์•„์ด๋“ค๊ณผ ์„ ๋ฌผ ์ƒ์ž โ˜…

 

import sys
import heapq
input=sys.stdin.readline

N,M=map(int,input().split())
c=list(map(lambda a: -int(a),input().split()))
w=list(map(int,input().split()))
y=0

heapq.heapify(c)

for i in range(M):
    popped = heapq.heappop(c)
    if -w[i] < popped:
        print(0)
        y+=1
        break
    heapq.heappush(c,popped+w[i])

if y==0:print(1)

 

๐Ÿง  ์ฐจ๋ก€๋Œ€๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ ๋ฌผ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋‹ด๊ฒจ ์žˆ๋Š” ์ƒ์ž๋ฅผ ๋งค๋ฒˆ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„ idea

 

๐Ÿง  ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์—ฐ์‚ฐ heappop & heappush๋Š” ๋ชจ๋‘ O(logN) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ณด์ด๋ฏ€๋กœ(heap binary tree ๊ตฌ์กฐ ์žฅ์ ), ์ด ๋‘ ์—ฐ์‚ฐ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด์„œ code ์‹œ๊ฐ„ ๋‹จ์ถ•

 

๐Ÿง  ์—ฌ๊ธฐ์„œ max-heap์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฒ˜์Œ์— lambda ์‹์œผ๋กœ ์Œ์ˆ˜๋งŒ ์ž…๋ ฅ๋ฐ›์Œ. ์ด์–ด์„œ ๋ถ€๋“ฑํ˜ธ ๋Œ€์†Œ ๋น„๊ต์™€ w์— ์Œ์ˆ˜ ๋ถ™์ด๋Š” ๊ฑฐ ์ ์ ˆํžˆ ๊ณ ๋ ค! (python์˜ heapq๋Š” min-heap์ด๋ฏ€๋กœ ์ž˜ ๋ณ€ํ˜•ํ•ด์ค˜์•ผ ํ•จ)

 

import sys
import heapq
input=sys.stdin.readline

N,M=map(int,input().split())
c=list(map(lambda a: -int(a),input().split()))
w=list(map(int,input().split()))
y=0

heapq.heapify(c)

for i in range(M):
    if -w[i] < c[0]:
        print(0)
        y+=1
        break
    c[0]+=(w[i])
    heapq.heapify(c)

if y==0:print(1)

 

๐Ÿง  ์œ„ code๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ code๋กœ, heapify() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ. heapify()์˜ time complexity๋Š” O(N)์œผ๋กœ, ์ด ๋Š” sorting์—์„œ heap์„ ์‚ฌ์šฉํ•œ ์˜๋ฏธ๊ฐ€ ์•„์˜ˆ ์—†๊ธฐ ๋•Œ๋ฌธ์— (๊ทธ๋ƒฅ ์ •๋ ฌ sorting ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค. ์ถ”ํ›„ ์ •๋ ฌ ์ •๋ฆฌ ํฌ์ŠคํŒ… ์ฐธ์กฐ) ๋‹น์—ฐํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ. ์ฃผ์˜ํ•˜์ž!


โ˜… 11286  ์ ˆ๋Œ“๊ฐ’ ํž™ โ˜…

 

import sys
import heapq
input=sys.stdin.readline

N=int(input())
heap=[]

for _ in range(N):
    x=int(input())
    if x!=0:
        heapq.heappush(heap,[abs(x),x])
    else:
        if len(heap)>0:print(heapq.heappop(heap)[1])
        else:print(0)

 

๐Ÿง  max-heap, min-heap์ด ์•„๋‹Œ ์ ˆ๋Œ“๊ฐ’ heap์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง  heappush์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ tuple์˜ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด, tuple์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— ์˜ํ•ด heap์ด ์™„์„ฑ๋˜๊ณ , ์ฒซ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ, tuple์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ heap์ด ๊ตฌ์„ฑ๋œ๋‹ค.

 

๐Ÿง  ์•„๋ž˜ docu ๋‚ด์šฉ ์ฐธ์กฐ

 

- ์ถœ์ฒ˜) https://docs.python.org/2/library/heapq.html#basic-examples

 

๐Ÿง  ๋”ฐ๋ผ์„œ, heappush() ์‚ฌ์šฉ ์‹œ tuple์„ ์‚ฌ์šฉํ•ด heap์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ . ๊ธฐ์–ตํ•˜์ž! ์œ„ ๋ฌธ์ œ๋Š” ๋จผ์ € ์ ˆ๋Œ“๊ฐ’์œผ๋กœ heap์„ ๊ตฌ์„ฑํ•˜๊ณ , ๋งŒ์•ฝ ๊ฐ™์„ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ x, ์ฆ‰ x๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ ๋จผ์ € heappop() ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.


โ˜… 15903 ์นด๋“œ ํ•ฉ์ฒด ๋†€์ด โ˜…

 

import sys
import heapq
input=sys.stdin.readline

n,m=map(int,input().split())
l=list(map(int,input().split()))
heapq.heapify(l)

for _ in range(m):
    a = heapq.heappop(l)
    b = heapq.heappop(l)
    heapq.heappush(l,a+b)
    heapq.heappush(l,a+b)
print(sum(l))

 

๐Ÿง  greedy ์œ ํ˜•๊ณผ ํ•ฉ์นœ ๋ฌธ์ œ๋กœ, ์ž‘์€ ์ ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ๋ ค๋ฉด, ๋งค๋ฒˆ ์นด๋“œ๋ฅผ ๋’ค์ง‘์„ ๋•Œ๋งˆ๋‹ค ์ œ์ผ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋‘ ์ˆ˜๋ฅผ ์„ ํƒํ•ด ์„œ๋กœ ํ•ฉํ•œ๊ฒŒ, ๋‹น์—ฐํžˆ ์ „์ฒด ํ•ฉ์˜ ์ตœ์†Œ๊ฐ€ ๋œ๋‹ค.

 

๐Ÿง  sort()๋ณด๋‹ค heappop & heappush ์ž๋ฃŒ๊ตฌ์กฐ heap์„ ์‚ฌ์šฉํ•ด ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜์˜€๊ณ , ๋งค๋ฒˆ heappop(), heappush()๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค complete-binary tree ํ˜•ํƒœ์˜ heap์„ ์™„์„ฑํ•˜๋ฏ€๋กœ, ๋งค ์ผ€์ด์Šค๋งˆ๋‹ค ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‹œ๊ฐ„ ํšจ์œจ์ ์ธ(O(logN)) ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€