https://www.acmicpc.net/problem/11286
11286๋ฒ: ์ ๋๊ฐ ํ
์ฒซ์งธ ์ค์ ์ฐ์ฐ์ ๊ฐ์ N(1≤N≤100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ์ฐ์ฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ ์ x๊ฐ ์ฃผ์ด์ง๋ค. ๋ง์ฝ x๊ฐ 0์ด ์๋๋ผ๋ฉด ๋ฐฐ์ด์ x๋ผ๋ ๊ฐ์ ๋ฃ๋(์ถ๊ฐํ๋) ์ฐ์ฐ์ด๊ณ , x๊ฐ 0
www.acmicpc.net

์ดํด
- ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ํ ์ ์๋ ๋ฌธ์
- ํ์ด์ฌ ๋ด์ฅํจ์์ธ Heapq๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํ ์ ์์ง๋ง, ์ง์ ๊ตฌํํด๋ด
๊ตฌํ
- ๋ด์ฅํจ์ ์ฌ์ฉ
- import heapq ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋๊ฐ๊ณผ ์ค๊ฐ์ ๊ฐ์ด ์ ์ฅํ์ฌ ๋น๊ตํ์ฌ ์ฌ์ฉ
- ์ง์ ๊ตฌํ
- class๋ฅผ ํตํด ์ค ๊ฐ์ ์ ์ฅํ๋ฉด ์ ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ์ฌ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑ
์ฝ๋
# 11286 ์ ๋๊ฐ ํ
import sys
input = sys.stdin.readline
class AbsoluteHeap:
def __init__(self, N:int) -> None:
# ์ ์ฒด ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ํ์ฌ heap list๋ฅผ ์์ฑ
# ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅ
self.tree = [0] * (2*N+2)
self.length = 0
# ํ ์ํธ(์์ ๋
ธ๋๋ฅผ ์
๋ ฅ๋ฐ์)
# ์์ ๋
ธ๋ 0 -> root์์ ์๋๋ก ๋ด๋ ค๊ฐ
# ์์ ๋
ธ๋ 0์ด ์๋ ๋ค๋ฅธ ์ธ๋ฑ์ค -> ์ธ๋ฑ์ค์์ ์๋ก ์ฌ๋ผ๊ฐ
def heap_sort(self, node:int) -> None:
# ์์๋
ธ๋๊ฐ root ๋
ธ๋ ์ผ ๋ -> ์๋๋ก ๋ด๋ ค๊ฐ
if node == 0:
while node < self.length:
left, right = 2*node+1, 2*node+2
# ๊ธธ์ด๋ฅผ ๋์ด๊ฐ๋ฉด ํธ๋ฆฌ์์ ๋ฒ์ด๋จ(leaf ๋
ธ๋๊ฐ 0์)
if node >= self.length:
break
if left >= self.length and right >= self.length:
node += 1
# leaf ๋
ธ๋์์ ํ๋๋ง ๋์ด๊ฐ๋ ๊ฒฝ์ฐ(leaf ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ)
elif left >= self.length: # ์ผ์ชฝ leaf ๋
ธ๋ 0
# ์ ๋๊ฐ์ด ์์ ๊ฒ ๊ธฐ์ค, ๊ฐ์ ๋ ๊ฐ์ด ์์ ์น๊ตฌ๋ฅผ root ๋
ธ๋์ ๊ตํ
if abs(self.tree[right]) < abs(self.tree[node]):
self.tree[right], self.tree[node] = self.tree[node], self.tree[right]
elif abs(self.tree[right]) == abs(self.tree[node]):
if self.tree[right] < self.tree[node]:
self.tree[right], self.tree[node] = self.tree[node], self.tree[right]
node = right # ๋ค์ ํ์ ํ์ธ
elif right >= self.length: # ์ค๋ฅธ์ชฝ leaf ๋
ธ๋ 0
if abs(self.tree[left]) < abs(self.tree[node]):
self.tree[left], self.tree[node] = self.tree[node], self.tree[left]
elif abs(self.tree[left]) == abs(self.tree[node]):
if self.tree[left] < self.tree[node]:
self.tree[left], self.tree[node] = self.tree[node], self.tree[left]
node = left
else:
# ๋ชจ๋ ๋ฒ์ ๋ด์ ๊ฒฝ์ฐ(leaf ๋
ธ๋๊ฐ ๋ ๋ค ์๋ ๊ฒฝ์ฐ)
# ์ผ์ชฝ leaf ๋
ธ๋์ ์ค๋ฅธ์ชฝ leaf ๋
ธ๋๋ฅผ ๋น๊ต
# ๋ ์์ ์ชฝ leaf ๋
ธ๋์ root ๋
ธ๋ ๋น๊ต -> root ๋
ธ๋๊ฐ ๋ ํฌ๋ค๋ฉด ๊ตํ
if abs(self.tree[left]) > abs(self.tree[right]):
if abs(self.tree[node]) > abs(self.tree[right]) or (abs(self.tree[node]) == abs(self.tree[right]) and self.tree[node] > self.tree[right]):
self.tree[node], self.tree[right] = self.tree[right], self.tree[node]
node = right
elif abs(self.tree[left]) == abs(self.tree[right]):
if self.tree[left] > self.tree[right]:
if abs(self.tree[node]) > abs(self.tree[right]) or (abs(self.tree[node]) == abs(self.tree[right]) and self.tree[node] > self.tree[right]):
self.tree[node], self.tree[right] = self.tree[right], self.tree[node]
node = right
else:
if abs(self.tree[node]) > abs(self.tree[left]) or (abs(self.tree[node]) == abs(self.tree[left]) and self.tree[node] > self.tree[left]):
self.tree[node], self.tree[left] = self.tree[left], self.tree[node]
node = left
else:
if abs(self.tree[node]) > abs(self.tree[left]) or (abs(self.tree[node]) == abs(self.tree[left]) and self.tree[node] > self.tree[left]):
self.tree[node], self.tree[left] = self.tree[left], self.tree[node]
node = left
# ๋ค์ ๋
ธ๋๋ฅผ ํ์ํ์ง ๋ ์ด์ ์์๋ ๋๋ ๊ฒฝ์ฐ break
if node != left and node != right:
break
else: # ์์ ๋
ธ๋๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ -> leaf ๋
ธ๋์์ root๋
ธ๋ ์ชฝ์ผ๋ก ํ์
while node > 0:
# ์ธ๋ฑ์ค๊ฐ leaf ๋
ธ๋ ๊ธฐ์ค ์ผ์ชฝ(ํ์), ์ค๋ฅธ์ชฝ(์ง์)
# root node(N) -> left leaf node (2*N+1) / right leaf node (2*N + 2)
if node % 2: # left leaf node (2*N+1) -> (2*N+1)//2 = N
root = node // 2
else: # right leaf node (2*N+2) -> (2*N+2) //2 -1 = N
root = node // 2 - 1
# root ๋
ธ๋์ ๋น๊ตํ์ฌ ๊ตํํ ์ฌ์ง๊ฐ ์์ผ๋ฉด ๊ตํํ์ฌ ํ์
if abs(self.tree[root]) > abs(self.tree[node]) or (abs(self.tree[root]) == abs(self.tree[node]) and self.tree[root] > self.tree[node]):
self.tree[root], self.tree[node] = self.tree[node], self.tree[root]
node = root
else: # ๊ตํํ ํ์ ์์ผ๋ฉด ๋ ์ด์ ํ์ X
break
return
# ํ ํธ์
def push_num(self, num:int) -> None:
# ๋ง์ง๋ง ๋
ธ๋์ ์ถ๊ฐํ์ฌ ํ ์ํธ(leaf -> root)
self.tree[self.length] = num
self.heap_sort(self.length)
self.length += 1
return
# ํ ํ
def pop_num(self) -> int:
# root ๋
ธ๋๋ฅผ ์ ๊ฑฐํ ํ, ๋ง์ง๋ง leaf ๋
ธ๋๋ฅผ root ๋
ธ๋์ ๋ฃ์ด ํ ์ํธ(root -> leaf)
if self.length == 0:
return 0
root = self.tree[0]
self.tree[0], self.tree[self.length-1] = self.tree[self.length-1], 0
self.length -= 1
self.heap_sort(0)
return root
def solution():
N = int(input())
# class ๋ฅผ ์ด์ฉํ์ฌ ์ ๋๊ฐ ํ ๊ตฌ์ฑ
AH = AbsoluteHeap(N)
for _ in range(N):
x = int(input())
if x == 0:
print(AH.pop_num())
else:
AH.push_num(x)
return
if __name__ == "__main__":
solution()
๋๋์
- ํ์์ heapq๋ฅผ ์์ฃผ ์ฌ์ฉํ์์์๋ ๋ถ๊ตฌํ๊ณ ๊ฝค ํ๋ค๊ฒ ๊ตฌํํ์ต๋๋ค.
- ์ฐ์ ์์ ํ์ ๊ตฌ์กฐ์ ๋ก์ง์ ๋ค์ ๋์๋ณด๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
- ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ๋ค๋ ํ ๋ฒ์ฉ ๊ตฌํํด๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค...

๋ฐ์ํ
'๐ STUDY > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 10986. ๋๋จธ์ง ํฉ (0) | 2024.04.02 |
|---|---|
| [์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum) (0) | 2024.04.02 |
| ํฌ๋ฃจ์ค์นผ(Kruskal) - ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) (1) | 2024.01.10 |
| 18111. ๋ง์ธํฌ๋ํํธ (1) | 2024.01.09 |
| [์๊ณ ๋ฆฌ์ฆ] Union-Find (1) | 2024.01.07 |