์๋ ํ์ธ์! ์ด๋ฒ ํฌ์คํธ์์๋ ๋ฐฑ์ค 1766๋ฒ ๋ฌธ์ “๋ฌธ์ ์ง”์ ํจ๊ป ํ์ด๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์์๋ฅผ ์ ํ๋ ๋ฌธ์ ๋ก, ์์ ์ ๋ ฌ์ ํ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ํ, ์ต์ข ์ ์ธ ์ ๋ต ์ฝ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ URL: https://www.acmicpc.net/problem/1766
1. ๋ฌธ์ ์ค๋ช
“๋ฌธ์ ์ง” ๋ฌธ์ ๋ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์์๋ฅผ ์ ํ๋ ๋ฌธ์ ์ ๋๋ค. ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๋ค์ ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค:
1. ์ด๋ค ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋จผ์ ํ์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
2. ์ด๋ฌํ ๋ฌธ์ ๋ค ๊ฐ์ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ์์๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
3. ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํ ๊ฒฝ์ฐ, ๋ฌธ์ ๋ฒํธ๊ฐ ๋ ์์ ๋ฌธ์ ๋ฅผ ์ฐ์ ํ์ด์ผ ํฉ๋๋ค.
2. ๋ฌธ์ ์ ๊ทผ๋ฒ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ์ ๋ ฌ(Topological Sorting)์ ์ฌ์ฉํฉ๋๋ค. ํต์ฌ ์์ด๋์ด๋ ๊ฐ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ํ์ํ ์ ํ ๋ฌธ์ ์ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ด๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ ์์๋ฅผ ์ ํ๋ ๊ฒ์ ๋๋ค. ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1) ์ด๊ธฐ๊ฐ ์ค์
- ๋ฌธ์ ์ N๊ณผ ์ ๋ณด์ ์ M์ ์ ๋ ฅ๋ฐ์ต๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ์ฌ ๊ฐ ๋ฌธ์ ์ ์ ํ ๋ฌธ์ ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ๊ฐ ๋ฌธ์ ์ ์ง์ ์ฐจ์๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
2) ์์ ์ ๋ ฌ ์ค๋น
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ฌธ์ ๋ฅผ ์ฐ์ ์์ ํ(Priority Queue)์ ์ถ๊ฐํฉ๋๋ค.
3) ์์ ์ ๋ ฌ ์ํ
- ํ๊ฐ ๋น ๋๊น์ง ๋ค์์ ๋ฐ๋ณตํฉ๋๋ค:
- ํ์์ ๋ฌธ์ ๋ฅผ ํ๋ ๊บผ๋ด์ด ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค.
- ํ์ฌ ๋ฌธ์ ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ฌธ์ ์ ์ง์ ์ฐจ์๋ฅผ ๊ฐ์์ํค๊ณ , ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ฌธ์ ๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
4) ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ์ต์ข ์ ์ผ๋ก ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
3. ์ ๋ต ์ฝ๋
from queue import PriorityQueue
import sys
input = sys.stdin.readline
N, M = map(int, input().split()) # N: ๋ฌธ์ ์, M: ์ ๋ณด์ ์ (๊ฐ์ ์ ์)
adj = [[] for _ in range(N+1)] # ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
inDegree = [-1] + [0] * N # ๊ฐ ๋
ธ๋์ ์ง์
์ฐจ์๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
for _ in range(M):
a, b = map(int, input().split()) # a์์ b๋ก ๊ฐ๋ ๊ฐ์
adj[a].append(b) # ์ธ์ ๋ฆฌ์คํธ์ ๊ฐ์ ์ถ๊ฐ
inDegree[b] += 1 # b์ ์ง์
์ฐจ์ ์ฆ๊ฐ
pq = PriorityQueue() # ์ฐ์ ์์ ํ ์์ฑ
for i in range(1, N+1):
if inDegree[i] == 0: # ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐ
pq.put(i)
ans = [] # ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
while pq.qsize() > 0: # ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
n = pq.get()
ans.append(n) # ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐ
for i in adj[n]: # ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋
ธ๋์ ๋ํด
inDegree[i] -= 1 # ์ฐ๊ฒฐ๋ ๋
ธ๋์ ์ง์
์ฐจ์๋ฅผ ๊ฐ์
if inDegree[i] == 0: # ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ฉด
pq.put(i) # ํ์ ์ถ๊ฐ
print(*ans) # ๊ฒฐ๊ณผ ์ถ๋ ฅ
4. ์ฝ๋ ์ค๋ช
์ ์ฝ๋๋ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์์๋ฅผ ์์ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ณ์ฐํฉ๋๋ค. ๊ฐ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1) ์ด๊ธฐ๊ฐ ์ค์
- N๊ณผ M์ ์ ๋ ฅ๋ฐ๊ณ , ์ธ์ ๋ฆฌ์คํธ adj์ ์ง์ ์ฐจ์ ๋ฆฌ์คํธ inDegree๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- for๋ฌธ์ ํตํด ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ์ธ์ ๋ฆฌ์คํธ์ ์ง์ ์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
2) ์์ ์ ๋ ฌ ์ค๋น
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐ์ ์์ ํ์ ์ถ๊ฐํฉ๋๋ค.
3) ์์ ์ ๋ ฌ ์ํ
- ํ์์ ๋ ธ๋๋ฅผ ํ๋์ฉ ๊บผ๋ด์ด ๊ฒฐ๊ณผ ๋ฆฌ์คํธ ans์ ์ถ๊ฐํฉ๋๋ค.
- ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ์ง์ ์ฐจ์๋ฅผ ๊ฐ์์ํค๊ณ , ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ฉด ํ์ ์ถ๊ฐํฉ๋๋ค.
4) ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ๊ฒฐ๊ณผ ๋ฆฌ์คํธ ans๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
5. Github์ผ๋ก ํ์ธ
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ(๋ฐฑ์ค)_Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ(๋ฐฑ์ค) 2579[๊ณ๋จ ์ค๋ฅด๊ธฐ] (0) | 2024.08.02 |
---|---|
BOJ(๋ฐฑ์ค) 1463[1๋ก ๋ง๋ค๊ธฐ] (0) | 2024.08.01 |
BOJ(๋ฐฑ์ค) 4179[๋ถ!] (0) | 2024.07.29 |
BOJ(๋ฐฑ์ค) 1753[์ต๋จ๊ฒฝ๋ก] (0) | 2024.07.26 |
BOJ(๋ฐฑ์ค) 11725[ํธ๋ฆฌ์ ๋ถ๋ชจ ์ฐพ๊ธฐ] (0) | 2024.07.25 |