[Python] ํ ์๋ฃ๊ตฌ์กฐ / ํํ(heapq) / ํ์ด์ฌ์์ heapq ๋ชจ๋ ์ฌ์ฉ
ํ์ ํน์ ํ ๊ท์น์ ๊ฐ์ง๋ ํธ๋ฆฌ๋ก, ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐพ๋ ์ฐ์ฐ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์งํธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
ํ property : A๊ฐ B์ ๋ถ๋ชจ๋ ธ๋์ด๋ฉด A์ ํค๊ฐ๊ณผ B์ ํค๊ฐ ์ฌ์ด์๋ ๋์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๋ค
- ์ต์ ํ: ๋ถ๋ชจ ๋ ธ๋์ ํค๊ฐ์ด ์์ ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ํญ์ ์์ ํ
- ์ต๋ ํ: ๋ถ๋ชจ ๋ ธ๋์ ํค๊ฐ์ด ์์ ๋ ธ๋์ ํค๊ฐ๋ณด๋ค ํญ์ ํฐ ํ
์ด๋ฌํ ์์ฑ์ผ๋ก ์ธํด ํ์์๋ ๊ฐ์ฅ ๋ฎ์(ํน์ ๋์) ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ ธ๋๊ฐ ํญ์ ๋ฃจํธ์ ์ค๊ฒ ๋๊ณ ์ด๋ฅผ ์ด์ฉํด ์ฐ์ ์์ ํ์ ๊ฐ์ ์ถ์์ ์๋ฃํ์ ๊ตฌํํ ์ ์๋ค.
์ด๋ ํค๊ฐ์ ๋์ ๊ด๊ณ๋ ๋ถ๋ชจ/์์ ๊ฐ์๋ง ์ฑ๋ฆฝํ๊ณ , ํ์ ๋ ธ๋ ์ฌ์ด์๋ ๋์ ๊ด๊ณ๊ฐ ์ ํด์ง์ง ์๋๋ค.
ํ์ด์ฌ ํ ์๋ฃ๊ตฌ์กฐ
ํ์ด์ฌ heapq ๋ชจ๋์ heapq (priority queue) ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ค.
๋ชจ๋ ๋ถ๋ชจ ๋ ธ๋๋ ๊ทธ์ ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์๊ฑฐ๋ ํฐ ์ด์งํธ๋ฆฌ(binary tree) ๊ตฌ์กฐ์ธ๋ฐ, ๋ด๋ถ์ ์ผ๋ก๋ ์ธ๋ฑ์ค 0์์ ์์ํด k๋ฒ์งธ ์์๊ฐ ํญ์ ์์ ์์๋ค(2k+1, 2k+2) ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ต์ ํ์ ํํ๋ก ์ ๋ ฌ๋๋ค.
heapq๋ ๋ด์ฅ ๋ชจ๋๋ก ๋ณ๋์ ์ค์น ์์ ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
ํ ํจ์ ํ์ฉํ๊ธฐ
- heapq.heappush(heap, item) : item์ heap์ ์ถ๊ฐ
- heapq.heappop(heap) : heap์์ ๊ฐ์ฅ ์์ ์์๋ฅผ pop & ๋ฆฌํด. ๋น์ด ์๋ ๊ฒฝ์ฐ IndexError๊ฐ ํธ์ถ๋จ.
- heapq.heapify(x) : ๋ฆฌ์คํธ x๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก heap์ผ๋ก ๋ณํํจ (in linear time, O(N) )
์ต๋ ํ ๋ง๋ค๊ธฐ
ํ์ด์ฌ์ heapq ๋ชจ๋์ ์ต์ ํ์ผ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ต๋ ํ ๊ตฌํ์ ์ํด์๋ ํธ๋ฆญ์ด ํ์ํ๋ค.
IDEA: y = -x ๋ณํ์ ํ๋ฉด ์ต์๊ฐ ์ ๋ ฌ์ด ์ต๋๊ฐ ์ ๋ ฌ๋ก ๋ฐ๋๋ค.
ํ์ ์์๋ฅผ ์ถ๊ฐํ ๋ (-item, item)์ ํํ ํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ํํ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฐ์ ์์๋ก ํ์ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
์ด๋ ์์ ๊ฐ์ ๋ถํธ๋ฅผ ๋ฐ๊ฟจ๊ธฐ ๋๋ฌธ์, ์ต์ ํ์ผ๋ก ๊ตฌํ๋ heapq ๋ชจ๋์ ์ต๋ ํ ๊ตฌํ์ ํ์ฉํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์๋์ ์์๋ ๋ฆฌ์คํธ heap_items์ ์๋ ์์๋ค์ max_heap์ด๋ผ๋ ์ต๋ ํ ์๋ฃ๊ตฌ์กฐ๋ก ๋ง๋๋ ์ฝ๋์ด๋ค.
heap_items = [1,3,5,7,9]
max_heap = []
for item in heap_items:
heapq.heappush(max_heap, (-item, item))
print(max_heap)