[BOJ] 1516๋ฒ: ๊ฒ์ ๊ฐ๋ฐ (Python)
๋ฌธ์
https://www.acmicpc.net/problem/1516
์ ํ์ฌ์์ ์ด๋ฒ์ ์๋ก์ด ์ ๋ต ์๋ฎฌ๋ ์ด์ ๊ฒ์ ์ธ์ค ํฌ๋ํํธ๋ฅผ ๊ฐ๋ฐํ๊ธฐ๋ก ํ์๋ค. ํต์ฌ์ ์ธ ๋ถ๋ถ์ ๊ฐ๋ฐ์ด ๋๋ ์ํ๊ณ , ์ข ์กฑ๋ณ ๊ท ํ๊ณผ ์ ์ฒด ๊ฒ์ ์๊ฐ ๋ฑ์ ์กฐ์ ํ๋ ๋ถ๋ถ๋ง ๋จ์ ์์๋ค.
๊ฒ์ ํ๋ ์ด์ ๋ค์ด๊ฐ๋ ์๊ฐ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์์ ์๊ฐ์ ์ด์ฉํ์ฌ ๊ทผ์ฌํ๊ธฐ๋ก ํ์๋ค. ๋ฌผ๋ก , ์ด๋ค ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์ ๋ค๋ฅธ ๊ฑด๋ฌผ์ ๋จผ์ ์ง์ด์ผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋จ์ํ์ง๋ง์ ์์ ์๋ ์๋ค. ์๋ฅผ ๋ค๋ฉด ์คํํฌ๋ํํธ์์ ๋ฒ์ปค๋ฅผ ์ง๊ธฐ ์ํด์๋ ๋ฐฐ๋ญ์ ๋จผ์ ์ง์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฐฐ๋ญ์ ๋จผ์ ์ง์ ๋ค ๋ฒ์ปค๋ฅผ ์ง์ด์ผ ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ๊ฑด๋ฌผ์ ๋์์ ์ง์ ์ ์๋ค.
ํธ์์ ์์์ ๋ฌดํํ ๋ง์ด ๊ฐ์ง๊ณ ์๊ณ , ๊ฑด๋ฌผ์ ์ง๋ ๋ช ๋ น์ ๋ด๋ฆฌ๊ธฐ๊น์ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์๋๋ค๊ณ ๊ฐ์ ํ์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ์ข ๋ฅ ์ N(1 โค N โค 500)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ๊ทธ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง๋ก ํ๊ณ , ๊ฐ ์ค์ -1๋ก ๋๋๋ค๊ณ ํ์. ๊ฐ ๊ฑด๋ฌผ์ ์ง๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋ชจ๋ ๊ฑด๋ฌผ์ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
N๊ฐ์ ๊ฐ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ Algorithm
์์ ์ ๋ ฌ, Dynamic Programming
๐ป Logic
def topology_sort():
global result
q = deque()
for i in range(1, N+1):
if indegree[i] == 0:
q.append(i)
while q:
num = q.popleft()
result[num] += time[num]
for i in graph[num]:
# ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ด ๋์์ ์ง์ด์ง๋ ๊ฒฝ์ฐ ๊ณ ๋ ค
result[i] = max(result[i], result[num])
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)- ์์ ์ ๋ ฌ ํจ์
- ์ง์
์ฐจ์(
indegree) 0์ด๋ฉดdeque์ append deque์์ popleftํ๊ณresult๊ฐ ๋ณ๊ฒฝ, ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๊ฑฐ(์ง์ ์ฐจ์ -1)result๊ฐ์ ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ด ๋์์ ์ง์ด์ง๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ํด
result[i]์result[num]์ค max ๊ฐ์result[i]์ ์ ์ฅ
- ์ง์
์ฐจ์(
N = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
indegree = [0 for _ in range(N+1)]
time = [0 for _ in range(N+1)]
result = [0 for _ in range(N+1)]
for i in range(1, N+1):
temp = [int(x) for x in sys.stdin.readline().split()]
time[i] = temp[0]
for j in range(1, len(temp)):
if temp[j] == -1: break
graph[temp[j]].append(i)
indegree[i] += 1
topology_sort()
for i in range(1, N+1):
print(result[i])- ๊ทธ๋ํ ์ ๋ณด ์ ์ฅ ํ,
topology_sortํจ์ ์คํ
๐งฉ Code
์ ์ฒด ์ฝ๋ ํ์ธ
import sys
from collections import deque
def topology_sort():
global result
q = deque()
for i in range(1, N+1):
if indegree[i] == 0:
q.append(i)
while q:
num = q.popleft()
result[num] += time[num]
for i in graph[num]:
# ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๊ฑด๋ฌผ๋ค์ด ๋์์ ์ง์ด์ง๋ ๊ฒฝ์ฐ ๊ณ ๋ ค
result[i] = max(result[i], result[num])
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)
N = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
indegree = [0 for _ in range(N+1)]
time = [0 for _ in range(N+1)]
result = [0 for _ in range(N+1)]
for i in range(1, N+1):
temp = [int(x) for x in sys.stdin.readline().split()]
time[i] = temp[0]
for j in range(1, len(temp)):
if temp[j] == -1: break
graph[temp[j]].append(i)
indegree[i] += 1
topology_sort()
for i in range(1, N+1):
print(result[i])๐ Review
์ฒ์์๋ ๊ทธ๋ฅ ์์์ ๋ ฌ ๋ฌธ์ ํ ๋ฏ์ด ํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ ์ ๊ทผํด์ ํ์๋๋ฐ "์ฌ๋ฌ ๊ฐ์ ๊ฑด๋ฌผ์ ๋์์ ์ง์ ์ ์๋ค." ์ด ๋ถ๋ถ์ ์๊ฐ ๋ชปํ๊ณ ์์๋ค.
์ ๋ฌธ์ฅ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ฐ๋ก ํ์
ํ์ง ๋ชปํ๊ณ , ๊ทธ๋์ ์ด ๋ถ๋ถ์ ์ฒ๋ฆฌํ๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์๋ค.