๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ฝ”๋”ฉํ…Œ์ŠคํŠธ(Baekjoon)

[python] Baekjoon 1005 : ACM Craft

by Seop๐Ÿ˜€ 2024. 1. 21.
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ - Baekjoon 1005 : ACM Craft

https://www.acmicpc.net/problem/1005

 

1005๋ฒˆ: ACM Craft

์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K์ด ์ฃผ์–ด์ง„๋‹ค. (๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€

www.acmicpc.net

ํ•ต์‹ฌ

์ตœ์†Œ ์‹œ๊ฐ„ ๋‚ด ๊ฑด๋ฌผ ์™„์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‚ด์šฉ

์ด ๋ฌธ์ œ๋Š” ๊ฑด๋ฌผ ๊ฑด์„ค ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํŠน์ • ๊ฑด๋ฌผ์„ ์™„์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ฐพ๋Š” ๊ณผ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ฑด๋ฌผ์€ ๋…๋ฆฝ์ ์ธ ๊ฑด์„ค ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ผ๋ถ€ ๊ฑด๋ฌผ์€ ๋‹ค๋ฅธ ๊ฑด๋ฌผ๋“ค์ด ์™„์„ฑ๋œ ํ›„์—๋งŒ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„์™€ ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ดํ•ด๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

ACM Craft

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ด ๋ฌธ์ œ๋Š” Directed Acyclic Graph (DAG)๋ฅผ ์ด์šฉํ•œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. DAG์—์„œ ๊ฐ ๊ฑด๋ฌผ์€ ๋…ธ๋“œ๋กœ, ๊ฑด์„ค ์ˆœ์„œ๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ ๊ฑด๋ฌผ์„ ๋…ธ๋“œ๋กœ ๊ฐ–๋Š” DAG ์ƒ์„ฑ
  2. Topological Sorting์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑด๋ฌผ๋“ค์˜ ๊ฑด์„ค ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •
  3. ๊ฐ ๋…ธ๋“œ(๊ฑด๋ฌผ)์— ๋Œ€ํ•ด, ๊ทธ ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๊ณ„์‚ฐ

->  main point

  1. ์ž…๋ ฅ ํŒŒ์‹ฑ: ๋จผ์ €, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํŒŒ์‹ฑํ•˜์—ฌ ๋ฌธ์ œ์— ํ•„์š”ํ•œ ์ •๋ณด(๊ฑด๋ฌผ์˜ ์ˆ˜, ๊ทœ์น™, ๊ฑด์„ค ์‹œ๊ฐ„ ๋“ฑ)๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. ์œ„์ƒ ์ •๋ ฌ(Topological Sorting): ๊ฑด๋ฌผ๋“ค ์‚ฌ์ด์˜ ์˜์กด์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ, ์–ด๋–ค ์ˆœ์„œ๋กœ ๊ฑด๋ฌผ๋“ค์„ ๊ฑด์„คํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ ๊ฑด๋ฌผ์˜ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๊ฑด๋ฌผ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. ๋™์  ๊ณ„ํš๋ฒ•(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์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑด๋ฌผ๋“ค์˜ ๊ฑด์„ค ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๊ฐ ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ํƒ€๊ฒŸ ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

  1. ์ž…๋ ฅ ํŒŒ์‹ฑ:
    • t (ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜), n (๊ฑด๋ฌผ์˜ ์ˆ˜), k (๊ทœ์น™์˜ ์ˆ˜)๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„(build_times)๊ณผ ๊ฑด๋ฌผ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ทœ์น™(rules)์„ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ์œ„์ƒ ์ •๋ ฌ ์‹คํ–‰:
    • ๊ฐ ๊ฑด๋ฌผ์˜ ์ง„์ž… ์ฐจ์ˆ˜(indegree)์™€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„(graph)๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • rules๋ฅผ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๊ฐ ๊ฑด๋ฌผ์˜ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    • ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. ๋™์  ๊ณ„ํš๋ฒ• ์ ์šฉ:
    • ํ์—์„œ ๊ฑด๋ฌผ์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉด์„œ, ํ•ด๋‹น ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ์ž‘ ์‹œ๊ฐ„(dp)์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ ํ›„์† ๊ฑด๋ฌผ์— ๋Œ€ํ•ด ์ตœ์†Œ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ํ•ด๋‹น ๊ฑด๋ฌผ์˜ ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.
    • ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๊ฑด๋ฌผ์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ ์ถœ๋ ฅ:
    • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด, ๋ชฉํ‘œ ๊ฑด๋ฌผ(target)์„ ์ง“๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„์„ dp[target]์—์„œ ์กฐํšŒํ•˜๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

python

์ฐธ๊ณ  ์ž๋ฃŒ

- 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 ์ž๋ฃŒ.

 

๋Œ“๊ธ€