01) ๋ฌธ์
๋ฐฑ์ค์ด๋ ๋์์๊ฒ "๊ฐ์ด๋ฐ๋ฅผ ๋งํด์" ๊ฒ์์ ๊ฐ๋ฅด์ณ์ฃผ๊ณ ์๋ค. ๋ฐฑ์ค์ด๊ฐ ์ ์๋ฅผ ํ๋์ฉ ์ธ์น ๋๋ง๋ค ๋์์ ์ง๊ธ๊น์ง ๋ฐฑ์ค์ด๊ฐ ๋งํ ์ ์ค์์ ์ค๊ฐ๊ฐ์ ๋งํด์ผ ํ๋ค. ๋ง์ฝ, ๊ทธ๋์ ๋ฐฑ์ค์ด๊ฐ ์ธ์น ์์ ๊ฐ์๊ฐ ์ง์๊ฐ๋ผ๋ฉด ์ค๊ฐ์ ์๋ ๋ ์ ์ค์์ ์์ ์๋ฅผ ๋งํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด ๋ฐฑ์ค์ด๊ฐ ๋์์๊ฒ 1, 5, 2, 10, -99, 7, 5๋ฅผ ์์๋๋ก ์ธ์ณค๋ค๊ณ ํ๋ฉด, ๋์์ 1, 1, 2, 2, 2, 2, 5๋ฅผ ์ฐจ๋ก๋๋ก ๋งํด์ผ ํ๋ค. ๋ฐฑ์ค์ด๊ฐ ์ธ์น๋ ์๊ฐ ์ฃผ์ด์ก์ ๋, ๋์์ด ๋งํด์ผ ํ๋ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ /์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ฐฑ์ค์ด๊ฐ ์ธ์น๋ ์ ์์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. N์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๊ทธ ๋ค์ N์ค์ ๊ฑธ์ณ์ ๋ฐฑ์ค์ด๊ฐ ์ธ์น๋ ์ ์๊ฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ์ ์๋ -10,000๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
ํ ์ค์ ํ๋์ฉ N์ค์ ๊ฑธ์ณ ๋ฐฑ์ค์ด์ ๋์์ด ๋งํด์ผ ํ๋ ์๋ฅผ ์์๋๋ก ์ถ๋ ฅํ๋ค.
7
1
5
2
10
-99
7
5
// output is 1 1 2 2 2 2 5
02) ํ์ด
์ต๋ํ๊ณผ ์ต์ํ์ ํ์ฉํ์ฌ ์ค๊ฐ๊ฐ์ ์ฐพ์ ์ ์๋ค. heap_push, heap_pop ์ฐ์ฐ์์ ๋ณด์๋ฏ์ด heap์ ์ฌ์ฉํ์ฌ ํน์ ๊ฐ์ ๊ตฌํ๊ณ ์ ํ ๋๋ ์กฐ๊ฑด์ด ๋๋ ์ํ๋ฅผ ์ ์งํ๋ฉด์ ๊ฐ์ push ๋๋ pop ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
What is min heap and max heap?
ํ(heap)์ parent์ child๊ฐ ์ผ์ ํ ๋์๊ด๊ณ๋ฅผ ์ ์งํ๋ ์ด์ง ํธ๋ฆฌ ๋ชจ์์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ต์ ํ(min heap)์ parent๊ฐ child๋ณด๋ค ์์์ผ ํ๋ค
์ต๋ ํ(max heap)์ parent๊ฐ child๋ณด๋ค ์ปค์ผ ํ๋ค
- min heap์ root๊ฐ max heap์ root๋ณด๋ค ํฌ๋ค
- ๋ heap์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ฉด max๊ฐ 1 ํฌ๊ฑฐ๋, ์๋ก ๊ฐ๋ค
์์ ๊ฐ์ ์กฐ๊ฑด์ ์ ์งํ๋ฉด์ ๊ฐ์ push/popํ๋ฉด max heap์ ๋ฃจํธ ๋ ธ๋์๋ ํญ์ ๋ฌธ์ ์์ ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ์ด ์์นํ๊ฒ ๋จ์ ์ ์ ์๋ค.
- ํ์ฌ๊น์ง ๋ถ๋ฆฐ ์๊ฐ ์ง์์ธ ๊ฒฝ์ฐ: max heap๊ณผ min heap์ ๋ฃจํธ๊ฐ ์ค๊ฐ๊ฐ์ด๋ค. ๊ทธ ์ค ๋ ์์ max heap์ ๋ฃจํธ ์ ํ
- ํ์ฌ๊น์ง ๋ถ๋ฆฐ ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ: max heap์ ํฌ๊ธฐ๊ฐ 1 ํฌ๋ฏ๋ก, max heap์ ๋ฃจํธ๊ฐ ์ค๊ฐ๊ฐ์ด๋ค
# pseudo
max_heap, min_heap
new = int(input()) # ์๋ก ์ธ์น ์ ์
# ๋ง์ฝ max heap์ด 1 ๋ ํฌ๋ค๋ฉด, min heap์ ๋ฃ์ด balance๋ฅผ ์ ์งํ๋ค
if max_heap.size > min_heap.size:
min_heap.push(new)
# ๊ทธ๋ ์ง ์์ผ๋ฉด, max heap์ ๋ฃ๋๋ค
else:
max_heap.push(new)
# ๋ง์ฝ max heap์ ๋ฃจํธ๊ฐ min heap์ ๋ฃจํธ๋ณด๋ค ํฌ๋ฉด
# ์์ชฝ ๋ชจ๋๋ฅผ pop ํ๋ฉฐ swapํด push ํด์ค๋ค
if max_heap.root > min_heap.root:
larger = max_heap.pop()
min_heap.push(larger) # ๊บผ๋ธ ๊ฐ์ pushํ์ฌ ๋ค์ min heap์ด ์ ๋ ฌํ ์ ์๊ฒ ํ๋ค
smaller = min_heap.pop()
max_heap.push(smaller)
heap์ push์ pop์ ํ๋ ์ฐ์ฐ์ ์๊ฐ๋ณต์ก๋๊ฐ O(logN)์ด๋ค. ๋ต์์๋ heapq
๋ชจ๋์ ์ฌ์ฉํ๋๋ฐ, ์ฒ์์๋ min/max heap์ ๋ฐฐ์ด๋ก ์ก์ ํ, compare ํจ์์ ๊ฐ heap ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ push/pop์ ์ํํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ๋ฌธ์ ์์ ์ ๋๋ ๊ฐ๋ณ๊ฒ ์ ๋ต์ ๋ฑ์์ง๋ง, ์ค์ ์ฑ์ ๊ฒฐ๊ณผ๋ ์๊ฐ์ด๊ณผ ๊ฐ ๋์๋ค. ํ์ด์ฌ list
์ ๋ด์ฅํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ์๊ฐ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ ๊ฒ ๊ฐ๊ณ , heapq
๋ชจ๋์ list
๊ฐ ์๋ C์ array๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ/์ฑ๋ฅ๋ฉด์์ ๋ซ๋ค๊ณ ํ๋ค.
heapq๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก min heap ์ํ๋ฅผ ์ ์งํด ์ค๋ค. max heap์ ์ฌ์ฉํ๊ณ ์ถ์ ๋๋ ์์์ * -1
์ ์ทจํ์ฌ pushํด ์ฃผ๋ฉด ๋๋ค.
๐ฃ Python List Function Complexity
Operation | Example | TC | Notes |
---|---|---|---|
Index | list[i] |
O(1) | |
Store | list[i] = 0 |
O(1) | |
Length | len(list) |
O(1) | |
Append | list.append(5) |
O(1) | |
Pop | list.pop() |
O(1) | ๋ง์ง๋ง ์์ ์ ๊ฑฐ |
Clear | list.clear() |
O(1) | list = [] |
Slice | list[a:b] |
O(b-a) | |
Extend | list.extend(...) |
O(len(...)) | |
Construction | list(...) |
O(len(...)) | |
Cheak Equal | list1 == list2 |
O(N) | |
Insert | list[a:b] = ... |
O(N) | |
Delete | del list[i] |
O(N) | |
Containment | x in/not in list |
O(N) | |
Copy | list.copy() |
O(N) | |
Remove | list.remove(...) |
O(N) | |
Pop | list.pop(i) |
O(N) | ํน์ ์ธ๋ฑ์ค ์์ ์ ๊ฑฐ |
Extreme value | min(list)/max(list) |
O(N) | |
Reverse | list.reverse() |
O(N) | |
Iteration | for v in list: |
O(N) | |
Sort | list.sort() |
O(N Log N) | |
Multiply | k*list |
O(k N) |
03) ์ฝ๋(ํ์ด์ฌ)
import sys
import heapq
N = int(input())
X = [int(sys.stdin.readline()) for _ in range(N)]
minH = []
maxH = []
for i in range(N):
n = X[i]
if i == 0:
heapq.heappush(maxH, -n) # max heap
print(-maxH[0])
continue
elif len(minH) == len(maxH):
heapq.heappush(maxH, -n)
else:
heapq.heappush(minH, n)
if -maxH[0] > minH[0]:
minroot = heapq.heappop(minH)
heapq.heappush(maxH, -minroot)
maxroot = heapq.heappop(maxH)
heapq.heappush(minH, -maxroot)
print(-maxH[0])
'DevLog ๐จ > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevLog][Baekjoon] 8983: ์ฌ๋ฅ๊พผ (0) | 2023.08.16 |
---|---|
[DevLog][Baekjoon] 2110: ๊ณต์ ๊ธฐ ์ค์น (0) | 2023.08.16 |
[DevLog][Baekjoon] 2261: ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ (0) | 2023.08.14 |
[DevLog][Baekjoon] 1629: ๊ณฑ์ (0) | 2023.08.14 |
[BaekJoon] 1007: ๋ฒกํฐ ๋งค์นญ (0) | 2023.02.16 |