๐ง priority queue๋ฅผ ๊ตฌํํ๊ธฐ ์ํ heap ๊ด๋ จ ์ฌ๋ฌ ๋ฌธ์ ๋ ๊ธฐ์กด ์๋ฃ๊ตฌ์กฐ(stack, queue, deck)๋ณด๋ค ๋ ๋ณต์กํ tree๊ตฌ์กฐ๋ก, ์ค๊ธ ์ดํ์ ๋ฌธ์ ๋ ์๋ค. ์ค์๊ธ ์ด์๋ถํฐ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํ๋ฉฐ ์ ์ํด๋ณด์
๐ง priority queue ๊ด๋ จ ๊ฐ๋ ํฌ์คํ ์ฐธ๊ณ
โ 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)) ์๋ฃ๊ตฌ์กฐ์ด๋ค.
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Coordinate Compression Upper-Intermediate - 3 Solvedโ (0) | 2023.01.24 |
---|---|
โ Prefix Sum ์ค๊ธ - 5๋ฌธ์ ()โ (0) | 2023.01.18 |
โ Stack & Queue & Deque Upper-Intermediate I - 11 Solvedโ (0) | 2023.01.08 |
โ Bitmasking Intermediate I - 3 Solvedโ (0) | 2023.01.05 |
โ DP Upper-Intermediate I - 15 Solvedโ (0) | 2023.01.03 |
๋๊ธ