1) ํ(Heap)
ํ์ ์์ ์ด์งํธ๋ฆฌ ์ค ํ๋๋ก ๋ฃจํธ ๋ ธ๋๊ฐ ์ ์ฒด ํธ๋ฆฌ์ ์ต์๊ฐ(=์ต์๊ฐ ํ)์ด๋ ์ต๋๊ฐ(=์ต๋๊ฐ ํ)์ ๊ฐ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ด๋ค ๋ ธ๋์์๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ ๋ชจ๋ ์ต์ ํน์ ์ต๋ ํ์ด์ฌ์ผ ํ๋ฏ๋ก ์ฌ๊ท์ ์ผ๋ก ์ ์ ํ ์ ์๋ค.
์ ๋ฒ ์๊ฐ์ ๋ฐฐ์ ๋ ์ด์ง ํ์ ํธ๋ฆฌ์ ๋น๊ตํด ๋ณด๋ฉด
- ํค์ ํฌ๊ธฐ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ง ์๊ณ
- ์ด ๋๋ฌธ์ ๋น ๋ฅธ ํ์๋ ์ด๋ ค์ฐ๋ฉฐ
- ์์ ์ด์งํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ , ์ญ์ ๊ฐ ๋ง์ง๋ง ๋ ธ๋์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
์๋ฃ๊ตฌ์กฐ์ ํด๋น ํน์ฑ์์ ๋น๋กฏํ์ฌ ์ ์๋๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- insert(item) : item์ ๋ง์ง๋ง ๋ ธ๋์ ์ฝ์ ํ๋ค, ๋ฃจํธ ๋ ธ๋์์ ํฌ๊ธฐ๋น๊ต๋ฅผ ํตํด ์ ์ ํ ์์น๋ฅผ ์ฐพ์๋๊ฐ๋ค.
- remove() : ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ ๋ค, ์๋ง์ ๋ ธ๋๋ฅผ ํด๋น ์๋ฆฌ๋ก ์ด๋์ํจ๋ค.
๊ตฌํ
๋ฐฐ์ด์ ์ด์ฉํด์ ๊ตฌํํด ๋ณด์
→ ์์ ์ด์งํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ ์ญ์ ๊ฐ ๋ง์ง๋ง ๋ ธ๋์์๋ง ์ด๋ฃจ์ด์ง๋ฏ๋ก ๋ฐฐ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ธ๋ฑ์ค 0์ ์์๋ฅผ None์ผ๋ก ์ด๊ธฐํ ํ๋ฉด, ๋ถ๋ชจ๋ ธ๋, ์์๋ ธ๋์ ์ธ๋ฑ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค : n
- ์ผ์ชฝ ์์ ๋ ธ๋์ ์ธ๋ฑ์ค : 2n
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ์ธ๋ฑ์ค : 2n+1
ํจ์
- insert(item) : item์ ์ฝ์
- ์ฐ์ item๊ฐ์ ๋ง์ง๋ง ์์น์ ์ฝ์ ํ๋ค → ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ํฌ๋ฉด ์๋ก ์ด๋์ํจ๋ค.
- ์ต์ ๋ณต์ก๋ O(log n)
cf) ํ์ด์ฌ์์๋ ๋ ๋ณ์์ ๊ฐ์ ๋ฐ๊ฟ๋ ํ๋ฒ์ ๋ฐ๊ฟ ์ ์๋ค.
- a, b=b, a
์ฝ๋
class MaxHeap:
def __init__(self):
self.data = [None]
def insert(self, item):
self.data.append(item)
nowidx = len(self.data) -1
while nowidx >1:
if self.data[nowidx] > self.data[nowidx//2]:
self.data[nowidx],self.data[nowidx//2] = self.data[nowidx//2],self.data[nowidx]
nowidx=nowidx//2
else:
break
- remove() : ์ญ์
- ๋ฃจํธ ๋
ธ๋ ์ญ์ ํ๋ค, ์๋ง์ ๋
ธ๋๋ฅผ ์ฐพ์ ํด๋น ์๋ก์ด ๋ฃจํธ ๋
ธ๋๋ก ์ผ๋๋ค.
- ํธ๋ฆฌ์ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ์์๋ก ๋ฃจํธ ๋ ธ๋์ ์์นํ๊ณ ์์ ๋ ธ๋์ ๋น๊ต(๋์ค์ ๋ ํฐ ๊ฐ๊ณผ ๋ฐ๊พธ๊ธฐ)
- ์ต์ ๋ณต์ก๋ 2*O(log n)
- ๋ฃจํธ ๋
ธ๋ ์ญ์ ํ๋ค, ์๋ง์ ๋
ธ๋๋ฅผ ์ฐพ์ ํด๋น ์๋ก์ด ๋ฃจํธ ๋
ธ๋๋ก ์ผ๋๋ค.
์ฝ๋
class MaxHeap:
def __init__(self):
self.data = [None]
def remove(self):
if len(self.data) > 1:
self.data[1], self.data[-1] = self.data[-1], self.data[1]
data = self.data.pop(-1)
self.maxHeapify(1)
else:
data = None
return data
def maxHeapify(self, i):
# ์ผ์ชฝ ์์ (left child) ์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํฉ๋๋ค.
left =
i*2
# ์ค๋ฅธ์ชฝ ์์ (right child) ์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํฉ๋๋ค.
right =
i*2+1
smallest = i
# ์ผ์ชฝ ์์์ด ์กด์ฌํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ ์์์ (ํค) ๊ฐ์ด (๋ฌด์๋ณด๋ค?) ๋ ํฐ์ง๋ฅผ ํ๋จํฉ๋๋ค.
if
len(self.data)-1>left
and
self.data[smallest]<self.data[left]
:
# ์กฐ๊ฑด์ด ๋ง์กฑํ๋ ๊ฒฝ์ฐ, smallest ๋ ์ผ์ชฝ ์์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋๋ค.
smallest=left
# ์ค๋ฅธ์ชฝ ์์์ด ์กด์ฌํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์์์ (ํค) ๊ฐ์ด (๋ฌด์๋ณด๋ค?) ๋ ํฐ์ง๋ฅผ ํ๋จํฉ๋๋ค.
if
len(self.data)-1>right
and
self.data[smallest]<self.data[right]
:
# ์กฐ๊ฑด์ด ๋ง์กฑํ๋ ๊ฒฝ์ฐ, smallest ๋ ์ค๋ฅธ์ชฝ ์์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋๋ค.
smallest=right
if smallest != i:
# ํ์ฌ ๋
ธ๋ (์ธ๋ฑ์ค i) ์ ์ต๋๊ฐ ๋
ธ๋ (์ผ์ชฝ ์๋๋ฉด ์ค๋ฅธ์ชฝ ์์) ๋ฅผ ๊ต์ฒดํฉ๋๋ค.
self.data[i], self.data[smallest]=self.data[smallest], self.data[i]
# ์ฌ๊ท์ ํธ์ถ์ ์ด์ฉํ์ฌ ์ต๋ ํ์ ์ฑ์ง์ ๋ง์กฑํ ๋๊น์ง ํธ๋ฆฌ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
self.maxHeapify(smallest)
def solution(x):
return 0