๋ฌธ์ - Baekjoon 1005 : ACM Craft
https://www.acmicpc.net/problem/1005
1005๋ฒ: ACM Craft
์ฒซ์งธ ์ค์๋ ํ ์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K์ด ์ฃผ์ด์ง๋ค. (๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ฒ๋ถ
www.acmicpc.net
ํต์ฌ
์ต์ ์๊ฐ ๋ด ๊ฑด๋ฌผ ์์ฑ ์๊ณ ๋ฆฌ์ฆ
๋ด์ฉ
์ด ๋ฌธ์ ๋ ๊ฑด๋ฌผ ๊ฑด์ค ์์๋ฅผ ๊ณ ๋ คํ์ฌ ํน์ ๊ฑด๋ฌผ์ ์์ฑํ๋ ๋ฐ ํ์ํ ์ต์ ์๊ฐ์ ์ฐพ๋ ๊ณผ์ ์ ๋๋ค. ๊ฐ ๊ฑด๋ฌผ์ ๋ ๋ฆฝ์ ์ธ ๊ฑด์ค ์๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ผ๋ถ ๊ฑด๋ฌผ์ ๋ค๋ฅธ ๊ฑด๋ฌผ๋ค์ด ์์ฑ๋ ํ์๋ง ๊ฑด์คํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ์ ์๋ฃ ๊ตฌ์กฐ์ ์ดํด๋ฅผ ์๊ตฌํฉ๋๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ๋ Directed Acyclic Graph (DAG)๋ฅผ ์ด์ฉํ ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ๋๋ค. DAG์์ ๊ฐ ๊ฑด๋ฌผ์ ๋ ธ๋๋ก, ๊ฑด์ค ์์๋ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ฐ์ ์ผ๋ก ํํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
- ๊ฐ ๊ฑด๋ฌผ์ ๋ ธ๋๋ก ๊ฐ๋ DAG ์์ฑ
- Topological Sorting์ ์ฌ์ฉํ์ฌ ๊ฑด๋ฌผ๋ค์ ๊ฑด์ค ์์๋ฅผ ๊ฒฐ์
- ๊ฐ ๋ ธ๋(๊ฑด๋ฌผ)์ ๋ํด, ๊ทธ ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์ต์ ์๊ฐ์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๊ณ์ฐ
-> main point
- ์ ๋ ฅ ํ์ฑ: ๋จผ์ , ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ฒ ํ์ฑํ์ฌ ๋ฌธ์ ์ ํ์ํ ์ ๋ณด(๊ฑด๋ฌผ์ ์, ๊ท์น, ๊ฑด์ค ์๊ฐ ๋ฑ)๋ฅผ ์ถ์ถํฉ๋๋ค.
- ์์ ์ ๋ ฌ(Topological Sorting): ๊ฑด๋ฌผ๋ค ์ฌ์ด์ ์์กด์ฑ์ ๊ณ ๋ คํ์ฌ, ์ด๋ค ์์๋ก ๊ฑด๋ฌผ๋ค์ ๊ฑด์คํด์ผ ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ ๊ฑด๋ฌผ์ ์ง์ ์ฐจ์๋ฅผ ๊ณ์ฐํ๊ณ , ์ง์ ์ฐจ์๊ฐ 0์ธ ๊ฑด๋ฌผ๋ถํฐ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋์ ๊ณํ๋ฒ(Dynamic Programming, DP): ๊ฐ ๊ฑด๋ฌผ์ ์์ฑํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด DP๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์์ํ ์ ์๋ ์ต์ ์์ ์๊ฐ์ ๊ณ์ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ฝ๋
from collections import deque
import sys
def find_min_time(build_times, rules, target):
n = len(build_times)
indegree = [0] * (n + 1)
graph = [[] for _ in range(n + 1)]
dp = [0] * (n + 1)
for x, y in rules:
graph[x].append(y)
indegree[y] += 1
q = deque()
for i in range(1, n + 1):
if indegree[i] == 0:
q.append(i)
dp[i] = build_times[i - 1]
while q:
current = q.popleft()
for next_node in graph[current]:
indegree[next_node] -= 1
dp[next_node] = max(dp[next_node], dp[current] + build_times[next_node - 1])
if indegree[next_node] == 0:
q.append(next_node)
return dp[target]
def main():
input_data = sys.stdin.readlines()
idx = 0
t = int(input_data[idx].strip()) # ์ฒซ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ์
idx += 1
for _ in range(t):
n, k = map(int, input_data[idx].split())
idx += 1
build_times = list(map(int, input_data[idx].split()))
idx += 1
rules = []
for _ in range(k):
x, y = map(int, input_data[idx].split())
rules.append((x, y))
idx += 1
target = int(input_data[idx].strip())
idx += 1
print(find_min_time(build_times, rules, target))
if __name__ == "__main__":
main()
ํ์ด
์ด ์ฝ๋๋ ๋จผ์ ์ ๋ ฅ๋ ๊ฑด๋ฌผ ๊ฑด์ค ์๊ฐ๊ณผ ๊ท์น์ ๋ฐํ์ผ๋ก DAG๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ ํ Topological Sorting์ ์ฌ์ฉํ์ฌ ๊ฑด๋ฌผ๋ค์ ๊ฑด์ค ์์๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ฐ ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ์ต์ข ์ ์ผ๋ก ํ๊ฒ ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์ต์ ์๊ฐ์ ๋ฐํํฉ๋๋ค.
- ์
๋ ฅ ํ์ฑ:
- t (ํ ์คํธ ์ผ์ด์ค์ ์), n (๊ฑด๋ฌผ์ ์), k (๊ท์น์ ์)๋ฅผ ํ์ฑํฉ๋๋ค.
- ๊ฐ ๊ฑด๋ฌผ์ ์ง๋ ๋ฐ ํ์ํ ์๊ฐ(build_times)๊ณผ ๊ฑด๋ฌผ ๊ฐ์ ์์กด์ฑ ๊ท์น(rules)์ ํ์ฑํฉ๋๋ค.
- ์์ ์ ๋ ฌ ์คํ:
- ๊ฐ ๊ฑด๋ฌผ์ ์ง์ ์ฐจ์(indegree)์ ์์กด์ฑ ๊ทธ๋ํ(graph)๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- rules๋ฅผ ํตํด ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํ๊ณ , ๊ฐ ๊ฑด๋ฌผ์ ์ง์ ์ฐจ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ต๋๋ค.
- ๋์ ๊ณํ๋ฒ ์ ์ฉ:
- ํ์์ ๊ฑด๋ฌผ์ ํ๋์ฉ ๊บผ๋ด๋ฉด์, ํด๋น ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์ต์ ์์ ์๊ฐ(dp)์ ๊ฐฑ์ ํฉ๋๋ค.
- ๊ฐ ํ์ ๊ฑด๋ฌผ์ ๋ํด ์ต์ ์์ ์๊ฐ์ ์ ๋ฐ์ดํธํ๊ณ , ํด๋น ๊ฑด๋ฌผ์ ์ง์ ์ฐจ์๋ฅผ ๊ฐ์์ํต๋๋ค.
- ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ ๊ฑด๋ฌผ์ ํ์ ์ถ๊ฐํฉ๋๋ค.
- ๊ฒฐ๊ณผ ์ถ๋ ฅ:
- ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด, ๋ชฉํ ๊ฑด๋ฌผ(target)์ ์ง๊ธฐ ์ํ ์ต์ ์๊ฐ์ dp[target]์์ ์กฐํํ๊ณ ์ถ๋ ฅํฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- DAG์ Topological Sorting์ ๋ํ ๊ฐ๋
: [GeeksforGeeks](https://www.geeksforgeeks.org/topological-sorting/))
- Python์ deque ์ฌ์ฉ๋ฒ: [Python ๊ณต์ ๋ฌธ์](https://docs.python.org/3/library/collections.html#collections.deque))
- ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ: [Introduction to Dynamic Programming](https://www.educative.io/courses/grokking-dynamic-programming-patterns-for-coding-interviews))
- ์์ ์ ๋ ฌ(Topological Sorting): ์์ ์ ๋ ฌ์ ๋ํ ์ดํด๋ฅผ ๋๊ธฐ ์ํ GeeksforGeeks ์๋ฃ.
'์ฝ๋ฉํ ์คํธ(Baekjoon)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] Baekjoon 1007 : ๋ฒกํฐ ๋งค์นญ (0) | 2024.01.22 |
---|---|
[python] Baekjoon 1006 : ์ต๊ฒฉ์ ์ด๋ผ๊ธฐ (1) | 2024.01.21 |
[python] Baekjoon 1004 : ์ด๋ฆฐ ์์ (0) | 2024.01.20 |
[python] Baekjoon 1003 : ํผ๋ณด๋์น ํจ์ (0) | 2024.01.20 |
[python] Baekjoon 1002 : ํฐ๋ (0) | 2024.01.20 |
๋๊ธ