๋ฌธ์ ๋ถ์
์ฒซ ๋ฒ์งธ ๋จ๊ณ(๋ฌธ์ ์์ฝ ๋ฐ ์กฐ๊ฑด ํ์
)
1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์ด N๊ฐ์ ๋ฌธ์ ๋ก ๋ ๋ฌธ์ ์ง์ ํ๋ ค๊ณ ํจ.
๋ฌธ์ ๋์ด๋๋ ์์๋๋ก. 1๋ฒ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ฌ์ด ๋ฌธ์ , n๋ฒ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ์.
๋จผ์ ํ๋ฉด ์ข์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฑธ ์๊ฒ๋์ด, 3๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌธ์ ํ์ด ์งํ.
- n๊ฐ์ ๋ฌธ์ ๋ ๋ชจ๋ ํ์ด์ผ ํจ
- ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์ ๋ฌธ์ ๋ ๋ฐ๋์ ๋จผ์ ํ์ด์ผ ํจ(=์ ์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ผ์ผ ํจ)
- ๊ฐ๋ฅํ๋ฉด ์ฌ์ด ๋ฌธ์ ๋ถํฐ ํ์ด์ผ ํจ
e.g.) 4๊ฐ์ ๋ฌธ์ , 4๋ฒ ๋ฌธ์ ๋ 2๋ฒ ๋ฌธ์ ๋ณด๋ค ๋จผ์ ํธ๋ ๊ฒ์ด ์ข๊ณ 3๋ฒ ๋ฌธ์ ๋ 1๋ฒ ๋ฌธ์ ๋ณด๋ค ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์.
๋ง์ผ 4-3-2-1 ์์๋ก ๋ฌธ์ ๋ฅผ ํ๊ฒ๋๋ฉด, ์กฐ๊ฑด 1,2๋ ๋ง์กฑํ๋, ์กฐ๊ฑด 3์ ๋ง์กฑ๋ชปํจ.(3์ 4๋ณด๋ค ์ฝ๊ธฐ์ ๋จผ์ ํ์ด์ผ ํจ)
๋ฐ๋ผ์ ์กฐ๊ฑด 3๊ฐ์ง๋ฅผ ๋ง์กฑํ๋ ค๋ฉด 3-1-4-2๊ฐ ๋๋ค.
์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ n(1โคnโค32000)์ ์ ์ ๋ฌธ์ ์ ๊ฐ์ m(1โคmโค100,000)
๋์งธ ์ค๋ถํฐ m๊ฐ ์ค์ ๊ฑธ์ณ ๋ ์ ์ a,b๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง.
์ด๋ a๋ b๋ณด๋ค ๋จผ์ ํธ๋๊ฒ ์ข์.
ํญ์ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง.
๋ฌธ์ ๋ฒํธ๋ฅผ ํ์ด์ผ ํ๋ ์์๋๋ก ๋น์นธ์ ๋๊ณ ์ถ๋ ฅ
๋ ๋ฒ์งธ ๋จ๊ณ (๋ฌธ์ ํต์ฌ ํ์
)
๋จผ์ ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ ๋ง์น ๋ํ๊ต ๊ณผ๋ชฉ์์ ์ ์๊ณผ๋ชฉ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ฌด์กฐ๊ฑด ์ ์๊ด๊ณ๋ฅผ ์ง์ผ์ผ ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ ์๊ด๊ณ๊ฐ ์๋ ๊ฒ์ ๊ทธ๋ํ ๋ก ๋ ์ฌ๋ ค๋ณด์.
3๋ฒ ๋
ธ๋ โ 1๋ฒ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํด.
4๋ฒ ๋
ธ๋ โ 2๋ฒ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํด.
์ด๋ 3๋ฒ ๋
ธ๋๋ 4๋ฒ ๋
ธ๋ ์ค์ ๋ ์ฌ์ด ๋ฌธ์ ๋ 3๋ฒ ๋
ธ๋์.
3๋ฒ ๋
ธ๋๋ฅผ ํ๊ณ , 1๋ฒ ๋
ธ๋์ 4๋ฒ ๋
ธ๋ ์ค ๋จผ์ ํ์ด์ผ ํ๋ ๊ฑด 1๋ฒ ๋
ธ๋์ด๊ธฐ์ 1๋ฒ ๋
ธ๋๋ฅผ ํผ๋ค.
๋จ์ ๊ฑด 2, 4๋ฒ ๋
ธ๋์ด๊ธฐ์, 4๋ฒ ๋
ธ๋๋ฅผ ํ๊ณ 2๋ฒ ๋
ธ๋๋ฅผ ํผ๋ค.
์ฌ์ดํด์ด ์์ผ๋ฉฐ ์์๊ฐ ์ ํด์ ธ ์๋ ์ผ๋ จ์ ์์
์ ์ฐจ๋ก๋๋ก ์ํํด์ผ ํ ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ธ ์์ ์ ๋ ฌ
์์ ์ ๋ ฌ์ ์ง์
์ฐจ์, ์ง์ถ ์ฐจ์์ ๊ฐ๋
์ ์์์ผ ํ๋ค.
- ์ง์
์ฐจ์(indegree): ํน์ ๋
ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ๊ฐ์
- ์ง์ถ ์ฐจ์(outdegree): ํน์ ๋
ธ๋์์ ๋๊ฐ๋ ๊ฐ์ ๊ฐ์
์์ ์ ๋ ฌ์ ๋์ ๊ณผ์
ํ๋ฅผ ์ด์ฉํ๋ย ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค
- ์ง์
์ฐจ์๊ฐ 0์ธ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ํ๊ฐ ๋น ๋๊น์ง ๋ค์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ๋
ธ๋์์ ๋๊ฐ๋ ๊ฐ์ ์ ๊ทธ๋ํ์์ ์ ๊ฑฐํ๋ค
- ์๋กญ๊ฒ ์ง์
์ฐจ์๊ฐ 0์ด ๋ ๋
ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
=>ย ๊ฒฐ๊ณผ ์ ์ผ๋กย ๊ฐ ๋
ธ๋๊ฐ ํ์ ๋ค์ด์จ ์์๊ฐ ์์ ์ ๋ ฌ์ ์ํํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค
์์ ์ ๋ ฌ์ ํน์ง
- ์์ ์ ๋ ฌ์ DAG์ ๋ํด์๋ง ์ํํ ์ ์๋ค
- DAG (Direct Acyclic Graph):ย ์ํํ์ง ์๋ ๋ฐฉํฅ ๊ทธ๋ํ
- ์์ ์ ๋ ฌ์์๋ย ์ฌ๋ฌ ๊ฐ์ง ๋ต์ด ์กด์ฌํ ์ ์๋ค
- ํ ๋จ๊ณ์์ ํ์ ์๋กญ๊ฒ ๋ค์ด๊ฐ๋ ์์๊ฐ 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ต์ด ์กด์ฌํ๋ค
- ๋ชจ๋ ์์๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ํ๊ฐ ๋น๋ค๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ค๊ณ ํ๋จํ ์ ์๋ค
- ์ฌ์ดํด์ ํฌํจ๋ ์์ ์ค์์ ์ด๋ ํ ์์๋ ํ์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ค
- ์คํ์ ํ์ฉํ DFS๋ฅผ ์ด์ฉํด ์์ ์ ๋ ฌ์ ์ํํ ์๋ ์๋ค

ํ๊ฐ ์๋๋ผ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์ธ heapq ๋ฅผ ์ด์ฉํด ์์์ ๋ ฌ์ ๊ตฌํํ๊ฒ ์.
3๋ฒ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ํ 1, 4๋ฒ ๋
ธ๋ ์ค ์ฐ์ ์์๊ฐ ๋์ 1๋ฒ ๋
ธ๋๋ฅผ ๋จผ์ ํ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ด์ฌ์ heapq๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ํ์ด๊ธฐ์ ๋ฃ์๋ค๊ฐ ๋นผ๋ ๊ฒ๋ง์ผ๋ก๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด ๋๋ค.
์ฝ๋ ์์ฑ
import heapq
n, m = map(int, input().split())
# ์์์ ๋ ฌ ๊ทธ๋ํ
graph = [[] for _ in range(n + 1)] # 1-based
# ์ง์
์ฐจ์ ๋ฆฌ์คํธ
indegree = [0 for _ in range(n + 1)]
# ์ฐ์ ์์ ํ
que = []
# ์ ์๋ฌธ์
for _ in range(m):
first, last = map(int, input().split())
graph[first].append(last)
indegree[last] += 1 # ์ง์
์ฐจ์ + 1 ํด์ค๋ค
# ์์์ ๋ ฌ
def topology_sort():
# ์ ๋ต ๋ด์ ๋ฆฌ์คํธ
res = []
# 1. ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ถํฐ ํ์ ์ฝ์
for i in range(1, n + 1):
if indegree[i] == 0:
heapq.heappush(que, i)
# 2. ํ๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
while que:
# ํ์์ ์์ ๊บผ๋ด๊ธฐ
now = heapq.heappop(que) # ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ์ถ์ถ
res.append(now)
# 2-1. ํด๋น ์์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์์์ 1์ ๋บ๋ค.
for j in graph[now]:
indegree[j] -= 1
# 2-2. ์๋กญ๊ฒ ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
if indegree[j] == 0:
heapq.heappush(que, j)
# ์์์ ๋ ฌ ์ํํ ์ ๋ต ์ถ๋ ฅ
for r in res:
print(r, end=' ')
topology_sort()
๋๋์
์์์ ๋ ฌ์ด๋๊ฒ๋ ์๊ตฌ๋.
์ฒ์์ ๋จผ์ ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์๋ฃ๊ตฌ์กฐํ๋ฅผ ์ด๋ป๊ฒ ํ ์ง ๋ง๋งํ๋๋ฐ, ๊ทธ๋ํโ์์์ ๋ ฌโ์ฐ์ ์์ ํ๊น์ง ๋๋ฌํ๋ ์ฌ๊ณ ๋จ๊ณ๊ฐ ์ฒด๊ณ์ ์ด๋ผ์ ํ๊ธฐ์ ์ข์๋ค(?)
- ์ฐธ๊ณ ํ ๊ธ
์์ ์ ๋ ฌ ํฌ์คํ
์ค๋ช
๊ตฟ
[[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ๋ ฌ (Topological Sorting)](https://velog.io/@kimdukbae/์์-์ ๋ ฌ-Topological-Sorting)
๋ฌธ์ ๋ณด๊ณ ๊ณ ๋ฏผ ํ ์ฐพ์๋ณธ ํฌ์คํ
ํ์ด ๊ตฟ
[[๋ฐฑ์ค] 1766๋ฒ ๋ฌธ์ ์ง(feat. ์์ ์ ๋ ฌ, heapq)](https://mgyo.tistory.com/807)
๋ฌธ์ ๋ถ์
์ฒซ ๋ฒ์งธ ๋จ๊ณ(๋ฌธ์ ์์ฝ ๋ฐ ์กฐ๊ฑด ํ์ )
1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์ด N๊ฐ์ ๋ฌธ์ ๋ก ๋ ๋ฌธ์ ์ง์ ํ๋ ค๊ณ ํจ.
๋ฌธ์ ๋์ด๋๋ ์์๋๋ก. 1๋ฒ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ฌ์ด ๋ฌธ์ , n๋ฒ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ์.
๋จผ์ ํ๋ฉด ์ข์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฑธ ์๊ฒ๋์ด, 3๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌธ์ ํ์ด ์งํ.
e.g.) 4๊ฐ์ ๋ฌธ์ , 4๋ฒ ๋ฌธ์ ๋ 2๋ฒ ๋ฌธ์ ๋ณด๋ค ๋จผ์ ํธ๋ ๊ฒ์ด ์ข๊ณ 3๋ฒ ๋ฌธ์ ๋ 1๋ฒ ๋ฌธ์ ๋ณด๋ค ๋จผ์ ํธ๋ ๊ฒ์ด ์ข์.
๋ง์ผ 4-3-2-1 ์์๋ก ๋ฌธ์ ๋ฅผ ํ๊ฒ๋๋ฉด, ์กฐ๊ฑด 1,2๋ ๋ง์กฑํ๋, ์กฐ๊ฑด 3์ ๋ง์กฑ๋ชปํจ.(3์ 4๋ณด๋ค ์ฝ๊ธฐ์ ๋จผ์ ํ์ด์ผ ํจ)
๋ฐ๋ผ์ ์กฐ๊ฑด 3๊ฐ์ง๋ฅผ ๋ง์กฑํ๋ ค๋ฉด 3-1-4-2๊ฐ ๋๋ค.
์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ n(1โคnโค32000)์ ์ ์ ๋ฌธ์ ์ ๊ฐ์ m(1โคmโค100,000)
๋์งธ ์ค๋ถํฐ m๊ฐ ์ค์ ๊ฑธ์ณ ๋ ์ ์ a,b๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง.
์ด๋ a๋ b๋ณด๋ค ๋จผ์ ํธ๋๊ฒ ์ข์.
ํญ์ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง.
๋ฌธ์ ๋ฒํธ๋ฅผ ํ์ด์ผ ํ๋ ์์๋๋ก ๋น์นธ์ ๋๊ณ ์ถ๋ ฅ
๋ ๋ฒ์งธ ๋จ๊ณ (๋ฌธ์ ํต์ฌ ํ์ )
๋จผ์ ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ ๋ง์น ๋ํ๊ต ๊ณผ๋ชฉ์์ ์ ์๊ณผ๋ชฉ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ฌด์กฐ๊ฑด
์ ์๊ด๊ณ๋ฅผ ์ง์ผ์ผ ํ๋ ๊ฒ์ด๋ค.๋ฐ๋ผ์, ์ ์๊ด๊ณ๊ฐ ์๋ ๊ฒ์
๊ทธ๋ํ๋ก ๋ ์ฌ๋ ค๋ณด์.3๋ฒ ๋ ธ๋ โ 1๋ฒ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด.
4๋ฒ ๋ ธ๋ โ 2๋ฒ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํด.
์ด๋ 3๋ฒ ๋ ธ๋๋ 4๋ฒ ๋ ธ๋ ์ค์ ๋ ์ฌ์ด ๋ฌธ์ ๋ 3๋ฒ ๋ ธ๋์.
3๋ฒ ๋ ธ๋๋ฅผ ํ๊ณ , 1๋ฒ ๋ ธ๋์ 4๋ฒ ๋ ธ๋ ์ค ๋จผ์ ํ์ด์ผ ํ๋ ๊ฑด 1๋ฒ ๋ ธ๋์ด๊ธฐ์ 1๋ฒ ๋ ธ๋๋ฅผ ํผ๋ค.
๋จ์ ๊ฑด 2, 4๋ฒ ๋ ธ๋์ด๊ธฐ์, 4๋ฒ ๋ ธ๋๋ฅผ ํ๊ณ 2๋ฒ ๋ ธ๋๋ฅผ ํผ๋ค.
์ฌ์ดํด์ด ์์ผ๋ฉฐ ์์๊ฐ ์ ํด์ ธ ์๋ ์ผ๋ จ์ ์์ ์ ์ฐจ๋ก๋๋ก ์ํํด์ผ ํ ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ธ
์์ ์ ๋ ฌ์์ ์ ๋ ฌ์
์ง์ ์ฐจ์, ์ง์ถ ์ฐจ์์ ๊ฐ๋ ์ ์์์ผ ํ๋ค.์์ ์ ๋ ฌ์
๋์ ๊ณผ์ ํ๋ฅผ ์ด์ฉํ๋ย ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค
=>ย ๊ฒฐ๊ณผ ์ ์ผ๋กย ๊ฐ ๋ ธ๋๊ฐ ํ์ ๋ค์ด์จ ์์๊ฐ ์์ ์ ๋ ฌ์ ์ํํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค
์์ ์ ๋ ฌ์ ํน์ง
ํ๊ฐ ์๋๋ผ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์ธ
heapq๋ฅผ ์ด์ฉํด ์์์ ๋ ฌ์ ๊ตฌํํ๊ฒ ์.3๋ฒ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ํ 1, 4๋ฒ ๋ ธ๋ ์ค ์ฐ์ ์์๊ฐ ๋์ 1๋ฒ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ด์ฌ์ heapq๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ํ์ด๊ธฐ์ ๋ฃ์๋ค๊ฐ ๋นผ๋ ๊ฒ๋ง์ผ๋ก๋
์ค๋ฆ์ฐจ์์ ๋ ฌ์ด ๋๋ค.์ฝ๋ ์์ฑ
๋๋์
์์์ ๋ ฌ์ด๋๊ฒ๋ ์๊ตฌ๋.
์ฒ์์ ๋จผ์ ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์๋ฃ๊ตฌ์กฐํ๋ฅผ ์ด๋ป๊ฒ ํ ์ง ๋ง๋งํ๋๋ฐ, ๊ทธ๋ํโ์์์ ๋ ฌโ์ฐ์ ์์ ํ๊น์ง ๋๋ฌํ๋ ์ฌ๊ณ ๋จ๊ณ๊ฐ ์ฒด๊ณ์ ์ด๋ผ์ ํ๊ธฐ์ ์ข์๋ค(?)
์์ ์ ๋ ฌ ํฌ์คํ ์ค๋ช ๊ตฟ
[[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ๋ ฌ (Topological Sorting)](https://velog.io/@kimdukbae/์์-์ ๋ ฌ-Topological-Sorting)
๋ฌธ์ ๋ณด๊ณ ๊ณ ๋ฏผ ํ ์ฐพ์๋ณธ ํฌ์คํ ํ์ด ๊ตฟ
[[๋ฐฑ์ค] 1766๋ฒ ๋ฌธ์ ์ง(feat. ์์ ์ ๋ ฌ, heapq)](https://mgyo.tistory.com/807)