
๐ป ๋ฌธ์ ์ ์
๋ฏผ์ค๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์ด N๊ฐ์ ๋ฌธ์ ๋ก ๋์ด ์๋ ๋ฌธ์ ์ง์ ํ๋ ค๊ณ ํ๋ค. ๋ฌธ์ ๋ ๋์ด๋ ์์๋ก ์ถ์ ๋์ด ์๋ค. ์ฆ 1๋ฒ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ฌ์ด ๋ฌธ์ ์ด๊ณ N๋ฒ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ๋๋ค.
์ด๋ค ๋ฌธ์ ๋ถํฐ ํ๊น ๊ณ ๋ฏผํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ๋ฏผ์ค๋, ๋ช๋ช ๋ฌธ์ ๋ค ์ฌ์ด์๋ '๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ '๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์๋ฅผ ๋ค์ด 1๋ฒ ๋ฌธ์ ๋ฅผ ํ๊ณ ๋๋ฉด 4๋ฒ ๋ฌธ์ ๊ฐ ์ฝ๊ฒ ํ๋ฆฐ๋ค๊ฑฐ๋ ํ๋ ์์ด๋ค. ๋ฏผ์ค๋ ๋ค์์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ํ ์์๋ฅผ ์ ํ๊ธฐ๋ก ํ์๋ค.
- N๊ฐ์ ๋ฌธ์ ๋ ๋ชจ๋ ํ์ด์ผ ํ๋ค.
- ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ ๊ฐ ์๋ ๋ฌธ์ ๋, ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ ๋ฅผ ๋ฐ๋์ ๋จผ์ ํ์ด์ผ ํ๋ค.
- ๊ฐ๋ฅํ๋ฉด ์ฌ์ด ๋ฌธ์ ๋ถํฐ ํ์ด์ผ ํ๋ค.
๋ฌธ์ ์ ๊ฐ์์ ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ๋ฏผ์ค๊ฐ ํ ๋ฌธ์ ์ ์์๋ฅผ ๊ฒฐ์ ํด ์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค.
๐ก ์ ๊ทผ ๋ฐ ์ค๊ณ
N๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ ํ๋์ ๋ ธ๋๋ก ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ ์ ์์ A → B ํํ์ ๊ทธ๋ํ๋ก ํํํ ์ ์๋ค. ์ฆ, A๋ ์ฐจ์๊ฐ 1, B๋ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ์์๊ฐ ์ ํด์ง๋๋ก ์ํํ๋ ์ ๋ ฌ์ธ ์์ ์ ๋ ฌ์ ์ด์ฉํ๋ค.
๋ฌธ์ ์ ์กฐ๊ฑด์์, 1๋ฒ ๋ฌธ์ ์ ๋์ด๋๋ 1, 2๋ฒ ๋ฌธ์ ์ ๋์ด๋๋ 2, … ์ด๋ฐ ์์ผ๋ก ์ฌ์ด ์์๊ฐ ์ ํด์ ธ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ๋ฉด ์ฌ์ด ๋ฌธ์ ๋ถํฐ ํ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ๋จผ์ ํ๋ฉด ์ข์ ๋ฌธ์ ๋ค ์ฌ์ด์์ ์ฐ์ ์์๋ฅผ ์ ํด ๋ฌธ์ ํ์ด ์์๋ฅผ ํ์ ํ ์ ์๋ค.
โ๏ธ ์๊ณ ๋ฆฌ์ฆ ํ์ด
# 1766 ๋ฌธ์ ์ง
import heapq
def topo_sort():
# min-heap ๊ตฌ์ฑ. heap์ ๋ค์ด๊ฐ ๋ฌธ์ ๋ ๋์ด๋ ์์ผ๋ก ์๋ ์ ๋ ฌ๋์ด ์ฌ์ด ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํ๋ค.
Q = []
result = []
# ์ฐจ์๊ฐ 0์ธ ๋
ธ๋(๋จผ์ ํ๋ฉด ์ข์ ๋ฌธ์ ) ๋ฃ๊ธฐ
for i in range(1, N+1):
if degree[i] == 0:
heapq.heappush(Q, i)
while Q:
curr = heapq.heappop(Q) # ํ์ฌ ํ ๋ฌธ์
result.append(curr) # ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐ
# [A, B]์์ A๋ฅผ ํ์์ผ๋ B๋ฅผ ํ ์ฐจ๋ก
for ix in graph[curr]:
degree[ix] -= 1
# ์ฐจ์๊ฐ 0์ด ๋์๋ค๋ฉด, ํด๋น ๋ฌธ์ ๋ฅผ ํ์ด๋ ๋๋ค.
if degree[ix] == 0:
heapq.heappush(Q, ix)
print(*result)
N, M = map(int, input().split())
degree = [0] * (N+1) # ๊ฐ ๋
ธ๋๋ณ ์ฐจ์
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
degree[b] += 1
topo_sort()
์์ ์ ๋ ฌ(Topology Sort) ๊ตฌํ์ด๋ค. ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋(๋ฆฌํ ๋ ธ๋)๋ผ๋ฉด heap์ ๋ฃ์ด์ค๋ค. heap์๋ ๋จผ์ ํ๋ฉด ์ข์(= ์์๊ฐ ์ ํด์ง) ๋ฌธ์ ๋ค์ด ๋ค์ด์ค๊ณ , ๊ทธ๋ฐ ๋ฌธ์ ๋ค ์ค์์๋ ๋์ด๋๊ฐ ์ฌ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ ์ ์ผ๋ก(min-heap) ํ ์ ์๋๋ก popํ๋ค.
๐๏ธ ์ต์ข ์ ์ถ ์ฝ๋ (Python3 ์ ์ถ)
# 1766 ๋ฌธ์ ์ง
import heapq
def topo_sort():
Q = []
result = []
for i in range(1, N+1):
if degree[i] == 0:
heapq.heappush(Q, i)
while Q:
curr = heapq.heappop(Q)
result.append(curr)
for ix in graph[curr]:
degree[ix] -= 1
if degree[ix] == 0:
heapq.heappush(Q, ix)
print(*result)
N, M = map(int, input().split())
degree = [0] * (N+1)
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
degree[b] += 1
topo_sort()
๐ญ ์ค๋์ ํ๊ณ
์์ ์ ๋ ฌ + ์ฐ์ ์์ ํ์ ๋ฌธ์ ์๋ค. ์์ ์ ๋ ฌ์ ์ฒ์ ๊ณต๋ถํ์ ๋ deque๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ๋ง์ด ์กด์ฌํ๋ ์ค ์์์ผ๋ ๋จผ์ ๋ค์ด์จ ์์ → min-heap์ ํตํ ์ต์๊ฐ์ผ๋ก๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
'Coding-Test > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] 16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (0) | 2026.03.26 |
|---|---|
| [Python] 2342 Dance Dance Revolution (0) | 2026.03.20 |
| [Python] 11049 ํ๋ ฌ ๊ณฑ์ ์์ (0) | 2026.03.20 |
| [Python] 16947 ์์ธ ์งํ์ฒ 2ํธ์ (0) | 2026.03.19 |
| [Python] 2613 ์ซ์๊ตฌ์ฌ (0) | 2026.03.18 |