백준 2309번 python 풀이 - 최대 힙
문제 링크
해결책
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import sys
class PriorityQueue:
def __init__(self, capacity: int = 9999999) -> None:
self.arr = [None] * capacity
self.capacity = capacity
self.size = 0
def insert(self, val):
self.size += 1
idx = self.size
self.arr[idx] = val
while(idx > 1 and self.arr[idx//2] < self.arr[idx]):
self.arr[idx//2], self.arr[idx] = self.arr[idx], self.arr[idx//2]
idx //= 2
return
def heapify(self, i):
largest = i
left = 2 * i
right = 2 * i + 1
if(left <= self.size and self.arr[left] > self.arr[i]):
largest = left
if(right<=self.size and self.arr[right] > self.arr[largest]):
largest = right
if(largest != i):
self.arr[i], self.arr[largest] = self.arr[largest], self.arr[i]
self.heapify(largest)
return
def deque(self):
if self.size == 0:
return 0
val = self.arr[1]
self.arr[1] = self.arr[self.size]
self.size -= 1
self.heapify(1)
return val
'''
class PriorityQueue:
def __init__(self, limit: int = 1000):
self.start = None
self.end = None
self.len = 0
def queue(self, val):
node = Node(val)
if self.len == 0:
self.start = node
elif self.len == 1:
if self.start.val > val:
self.start.ptr = node
else:
node.ptr = self.start
self.start = node
else:
cur = self.start
if cur.val < val:
node.ptr = self.start
self.start = node
else:
while cur.ptr is not None:
if cur.ptr.val > val:
cur = cur.ptr
node.ptr = cur.ptr
cur.ptr = node
self.len += 1
def dequeue(self):
if self.len <= 0:
return 0
val = self.start.val
self.start = self.start.ptr
self.len -= 1
if self.len <= 0:
self.start = None
self.end = None
return val
'''
N = int(sys.stdin.readline().rstrip())
que = PriorityQueue()
ans = []
for i in range(N):
code = int(sys.stdin.readline().rstrip())
if code:
que.insert(code)
else:
ans.append(que.deque())
for i in ans:
print(i)
주석으로 달 설명
우선순위 큐. 예전부터 나에게 잘 정리되지 않던 자료구조형이다. 분명 큐인데 트리 형태의 형을 가진다니, 이게 무슨?
일단 작동 방식은 이렇다.
root에 가장 큰 값이 온다 or root에 가장 작은값이 온다(parent가 child보다 크다, child_left와 child_right의 대소는 크게 상관없다), 또한 제일 하단의 child는 좌측부터 채운다. 이 규칙을 지속적으로 확인하는 함수를 제작한다(heapify()
) 이를 기반으로, insert()
함수는 새로운 값을 제일 좌측 하단에 넣고(idx = size), 그 다음에 child부터 정렬을 하면 된다. 새로 들어온 노드는 arr[size]로 잡는다면, 이를 기반으로 idx = size를 한 다음, while(size!=1 and arr[i] > arr[i//2])
라면 arr[i]와 arr[i//2]를 교체한다. deque()
의 경우, 반대로 root를 뽑아버린 다음, 제일 아래에 있는 노드를 root로드에 넣고, root부터 아까 이야기한 heapify()
함수를 사용한다. 이런 방식으로 우선순위 큐가 작성된다.
이를 처음에 배열로 구현하지 않고, 연결 리스트로 구현했는데, 이 때 시간 복잡도는 N^2과 1 이다. 하지만, heap의 경우에는 NlogN이 평균이라 더 빠르다더라.
추가 공부를 해서 더 기입하도록 하자.
This post is licensed under CC BY 4.0 by the author.