[SWEA] 2930. ํ(python)
๐๋ฌธ์
๐ช์์ด๋์ด
- max heap๊ตฌํ
max heap์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ ธ๋๋ค๋ณด๋ค ํฐ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ค. ์์ ์ด์ง ํธ๋ฆฌ๋ ๋ง์ง๋ง ํธ๋ฆฌ์ height๋ฅผ ์ ์ธํ๊ณ ๋ ธ๋๊ฐ ๋ชจ๋ ์กด์ฌํ๊ณ ๋ง์ง๋ง height์๋ ์ผ์ชฝ๋ถํฐ ๋ ธ๋๊ฐ ์ฐจ์์ผ๋ฉฐ leaf๋ ธ๋๋ ๋ง์ง๋ง height์๋ง ์กด์ฌํ๋ค.- add
max heap์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ถ๊ฐ๋๋ค. ์ถ๊ฐํ ์ธ๋ฑ์ค์ ๋ถ๋ชจ๋ ธ๋์ ๋น๊ตํด์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋ ํฌ๋ฉด max heap์ํ๋ผ ํ๋จํ๊ณ heapify๋ฅผ ๋ฉ์ถ๋ค. ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋ ์์ผ๋ฉด ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์๋๋ก ๋ด๋ฆฌ๊ณ ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ถ๋ชจ ๋ ธ๋ ์๋ฆฌ๋ก ์ฎ๊ธด ํ (๋ถ๋ชจ๋ ธ๋๊ฐ ๋ ํด๋ or root)๊น์ง heapify๋ฅผ ๋ฐ๋ณตํ๋ค. - delete
max heap์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ฉด root์ ์๋ ๊ฐ์ ๋ฐํํ๊ณ ๋ง์ง๋ง ๋ ธ๋๋ฅผ root๋ ธ๋ ์๋ฆฌ๋ก ์ฎ๊ธด๋ค. - heapify
๋ฃจํธ๋ ธ๋์์๋ถํฐ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์๋ ธ๋ ์ค ๋ ํฐ ์์๋ ธ๋ ์๋ฆฌ๋ก ์ฎ๊ธด๋ค. ์์๋ ธ๋๋ณด๋ค ํด๋๊น์ง ๋ฐ๋ณตํ๋ค. ์์ ๋ ธ๋๊ฐ ์์ ์๋ ์์ผ๋ ์์๋ ธ๋์ ์ฌ๋ถ๋ ์ฒดํฌํด์ผํ๋ค.
- add
๐ฅ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class max_heap:
def __init__(self):
self.queue=[]
def parent(self,index):
return (index-1)//2
def left_child(self,index):
return index*2+1
def right_child(self,index):
return index*2+2
def swap_node(self,inx,parent):
self.queue[inx],self.queue[parent]=self.queue[parent],self.queue[inx]
def add_node(self,node):
self.queue.append(node)
last = len(self.queue)-1
while last>=0:
parent = self.parent(last)
if parent>=0 and self.queue[parent]<self.queue[last]:
self.swap_node(last,parent)
last = parent
else: break
def delete_node(self):
last = len(self.queue)-1
if last<0:
return '-1 '
self.swap_node(last,0)
max_val = self.queue.pop()
self.max_heapify(0)
return '{} '.format(max_val)
def max_heapify(self,inx):
left,right = self.left_child(inx),self.right_child(inx)
max_inx = inx
if left<len(self.queue) and self.queue[left]>self.queue[max_inx]:
max_inx=left
if right<len(self.queue) and self.queue[right]>self.queue[max_inx]:
max_inx=right
if max_inx!=inx:
self.swap_node(inx,max_inx)
self.max_heapify(max_inx)
T=int(input())
answer=[]
for tc in range(1,T+1):
tmp='#{} '.format(tc)
n=int(input())
heap = max_heap()
for _ in range(n):
cal = list(map(int,input().split()))
if cal[0]==1:
heap.add_node(cal[1])
else:
tmp+=heap.delete_node()
answer.append(str(tmp))
for a in answer:
print(a)
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.