PS

[๋ฐฑ์ค€] 1005 ACM Craft with Python

ํ˜•์ค€_It's 2022. 7. 17. 22:33
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ BOJ 1005 ACM Craft

๐Ÿ’ก ์กฐ๊ฑด

  1. ์„œ๊ธฐ 2012๋…„! ๋“œ๋””์–ด 2๋…„๊ฐ„ ์ˆ˜๋งŽ์€ ๊ตญ๋ฏผ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ ๊ฒŒ์ž„ ACM Craft (Association of Construction Manager Craft)๊ฐ€ ๋ฐœ๋งค๋˜์—ˆ๋‹ค.
  1. ์ด ๊ฒŒ์ž„์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๊ฒŒ์ž„๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ACMํฌ๋ž˜ํ”„ํŠธ๋Š” ๋‹ค์ด๋‚˜๋ฏนํ•œ ๊ฒŒ์ž„ ์ง„ํ–‰์„ ์œ„ํ•ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค.
    ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์ž„๊ณผ ๋‘ ๋ฒˆ์งธ ๊ฒŒ์ž„์ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค.
    ๋งค ๊ฒŒ์ž„์‹œ์ž‘ ์‹œ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฑด๋ฌผ์€ ๊ฐ๊ฐ ๊ฑด์„ค์„ ์‹œ์ž‘ํ•˜์—ฌ ์™„์„ฑ์ด ๋  ๋•Œ๊นŒ์ง€ Delay๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. ํ”„๋กœ๊ฒŒ์ด๋จธ ์ตœ๋ฐฑ์ค€์€ ์• ์ธ๊ณผ์˜ ๋ฐ์ดํŠธ ๋น„์šฉ์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ์„œ๊ฐ•๋Œ€ํ•™๊ต๋ฐฐ ACMํฌ๋ž˜ํ”„ํŠธ ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค!
    ์ตœ๋ฐฑ์ค€์€ ํ™”๋ คํ•œ ์ปจํŠธ๋กค ์‹ค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ๊ธฐ์—์„œ ํŠน์ • ๊ฑด๋ฌผ๋งŒ ์ง“๋Š”๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒŒ์ž„์—์„œ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  1. ๋งค ๊ฒŒ์ž„๋งˆ๋‹ค ํŠน์ •๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ตœ๋ฐฑ์ค€์€ ์ขŒ์ ˆํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
    ๋ฐฑ์ค€์ด๋ฅผ ์œ„ํ•ด ํŠน์ •๊ฑด๋ฌผ์„ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์ง€์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด๋Š” ๋ฌธ์ œ.
  1. ์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
    ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K์ด ์ฃผ์–ด์ง„๋‹ค. (๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค)
  1. ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ๋‹น ๊ฑด์„ค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ D1, D2, ..., DN์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ์ฃผ์–ด์ง„๋‹ค.
    ์…‹์งธ ์ค„๋ถ€ํ„ฐ K+2์ค„๊นŒ์ง€ ๊ฑด์„ค์ˆœ์„œ X Y๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (์ด๋Š” ๊ฑด๋ฌผ X๋ฅผ ์ง€์€ ๋‹ค์Œ์— ๊ฑด๋ฌผ Y๋ฅผ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค)
    ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” ๋ฐฑ์ค€์ด๊ฐ€ ์Šน๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด์„คํ•ด์•ผ ํ•  ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ W๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  1. 2 ≤ N ≤ 1000
    1 ≤ K ≤ 100,000
    1 ≤ X, Y, W ≤ N
    0 ≤ Di ≤ 100,000, Di๋Š” ์ •์ˆ˜
  1. BFS, ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰ ์œ ํ˜•์˜ ๋ฌธ์ œ

๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

from collections import deque
from sys import stdin


def topology_sort(w):
    q = deque()
    dp = [0 for _ in range(n + 1)]
    for i in range(1, n + 1):
        if indegree[i] == 0:
            q.append(i)
            dp[i] = arr[i]

    while q:
        now = q.popleft()

        for node in graph[now]:
            indegree[node] -= 1
            dp[node] = max(dp[now] + arr[node], dp[node])
            if indegree[node] == 0:
                q.append(node)

    return dp[w]


for tc in range(int(stdin.readline())):
    n, m = map(int, stdin.readline().split())
    indegree = [0] * (n + 1)
    graph = [[] for _ in range(n + 1)]
    arr = [0] + list(map(int, stdin.readline().split()))
    for _ in range(m):
        a, b = map(int, stdin.readline().split())
        graph[a].append(b)
        indegree[b] += 1

    w = int(stdin.readline())
    print(topology_sort(w))

๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

์˜ˆ์ œ

2
4 4
10 1 100 10
1 2
1 3
2 4
3 4
4
8 8
10 20 1 5 8 7 1 43
1 2
1 3
2 4
2 5
3 6
5 7
6 7
7 8
7

์‹คํ–‰๊ฒฐ๊ณผ

120
39

โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

  1. ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•ด๋ณด์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๊ฑด๋ฌผ์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ์ˆœ์„œ๋Š” ๋‹ค๋ฅด๋‹ค.
    • ๋ฐฑ์ค€์ด๊ฐ€ ์ด๊ธฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ • ๊ฑด๋ฌผ์„ ์ง€์–ด์•ผ ์Šน๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํŠน์ • ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ ํ–‰๋˜๋Š” ๊ฑด๋ฌผ์„ ์ง€์„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  1. ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ฉด ์šฐ๋ฆฌ๋Š” ๊ฑด์„ค์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ฑด๋ฌผ์„ ์ฐจ๋ก€๋กœ ๊ฑด์„คํ•˜๋ฉด์„œ, W๋ฒˆ ๊ฑด๋ฌผ์„ ์ง€์„ ๋•Œ๊นŒ์ง€์˜ ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค.
    ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ„์ƒ์ •๋ ฌ์ธ๋ฐ, ์œ„์ƒ์ •๋ ฌ์˜ ๊ฐœ๋…๊ณ  ์œ„์— ์จ๋†“์€ ๊ฒƒ๊ณผ ๊ฐœ๋…์ด ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.
    ์œ„์ƒ์ •๋ ฌ์ด๋ž€, ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ์ž‘์—…์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๋•Œ ๊ทธ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  1. ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, ์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ•„์š”ํ•œ indegree ๋ฆฌ์ŠคํŠธ๋ฅผ n + 1 ๊ฐœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    ๋˜ํ•œ N + 1๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ทธ๋ž˜ํ”„๋„ ์ƒ์„ฑํ•œ๋‹ค.
    ๊ฐ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•˜๋Š”๋ฐ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ์ž…๋ ฅ๋ฐ›์€ ํ›„, ๊ฑด์„ค์ˆœ์„œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ๋ž˜ํ”„์— ์ž…๋ ฅํ•œ๋‹ค.
    ๋งŒ์•ฝ a, b๋ฅผ ์ž…๋ ฅ ๋ฐ›์•˜๋‹ค๋ฉด, graph[a].append(b) ์ด๋ฉฐ indegree[b] += 1 ์ด๋‹ค.
    b ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” a ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— +1 ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  1. ์ดํ›„, W ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋กœ์ง์ด ์žˆ๋Š” topology_sort() ํ•จ์ˆ˜์— W๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
    ์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š”, indegree ๋ฆฌ์ŠคํŠธ์—์„œ์˜ ๊ฐ’์ด 0์ธ ๊ฒƒ์„ q์— ๋จผ์ € ๋„ฃ๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    indegree ๋ฆฌ์ŠคํŠธ์—์„œ์˜ ๊ฐ’์€ ํ•ด๋‹น ๊ฑด๋ฌผ์ด ์ง€์–ด์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ง€์–ด์ ธ์•ผํ•  ๊ฑด๋ฌผ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  1. ์œ„์ƒ์ •๋ ฌ ํ•จ์ˆ˜์—์„œ๋Š” DP ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ฑด๋ฌผ์„ ์ง€์—ˆ์„ ๋•Œ์˜ ์†Œ์š”์‹œ๊ฐ„์„ ์ฒดํฌํ•œ๋‹ค.
    ํ์—์„œ ๋บ€ ๊ฑด๋ฌผ ๋ฒˆํ˜ธ(now) ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ ์ˆœํšŒํ•˜๋ฉด์„œ, ์ˆœํšŒํ•˜๋Š” ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ(node)์— ํ•ด๋‹นํ•˜๋Š” indegree์˜ ๊ฐ’์„ 1์”ฉ ๋นผ์ค€๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  DP[node] ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ DP[now] + ๊ฑด์„ค์— ํ•„์š”ํ•œ ์‹œ๊ฐ„[node] ๊ฐ’๊ณผ ๋น„๊ตํ•ด ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
  1. ์ดํ›„, indegree[node] ์˜ ๊ฐ’์ด 0 ์ด๋ผ๋ฉด queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ˜๋ณตํ•œ๋‹ค.
    queue ๊ฐ€ ๋ชจ๋‘ ๋นŒ ๋•Œ๊นŒ์ง€ ์ˆœํšŒ๋ฅผ ๋งˆ์ณค๋‹ค๋ฉด, DP[W] ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.
    DP[W]์˜ ๊ฐ’์€ W ๋ฒˆ ๊ฑด๋ฌผ์ด ์ง€์–ด์ง€๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ’พ ๋ฐฐ์šด์ 

  1. ์œ„์ƒ์ •๋ ฌ์ด๋ž€, ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ์ž‘์—…์„ ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๋•Œ ๊ทธ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
    ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ , ์‘์šฉํ•ด์•ผํ• ์ง€ ๋” ์—ฐ์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ, ๊ฐœ๋…๊ณผ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด
    ์ถฉ๋ถ„ํžˆ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด๋‹ค.
๋ฐ˜์‘ํ˜•