[BOJ][๐ŸŸก3][๋ฐฑ์ค€#01005] ACM Craft

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1005


๋ฌธ์ œ

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

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. ์ด๋ฒˆ ๊ฒŒ์ž„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™์ด ์ฃผ์–ด์กŒ๋‹ค.ย 1๋ฒˆ ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์ด ์™„๋ฃŒ๋œ๋‹ค๋ฉด 2๋ฒˆ๊ณผ 3๋ฒˆ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค. (๋™์‹œ์— ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค)ย ๊ทธ๋ฆฌ๊ณ  4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์ด ๋ชจ๋‘ ๊ฑด์„ค ์™„๋ฃŒ๋˜์–ด์•ผ์ง€๋งŒ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ฒ˜์Œ 1๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•˜๋Š”๋ฐ 10์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2๋ฒˆ ๊ฑด๋ฌผ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ๊ฑด์„คํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด 2๋ฒˆ์€ 1์ดˆ๋’ค์— ๊ฑด์„ค์ด ์™„๋ฃŒ๋˜์ง€๋งŒ ์•„์ง 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 4๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•  ์ˆ˜ ์—†๋‹ค. 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋•Œ 4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง€์„์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 4๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ธฐ๊นŒ์ง€๋Š” ์ด 120์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค. ํ”„๋กœ๊ฒŒ์ด๋จธ ์ตœ๋ฐฑ์ค€์€ ์• ์ธ๊ณผ์˜ ๋ฐ์ดํŠธ ๋น„์šฉ์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ์„œ๊ฐ•๋Œ€ํ•™๊ต๋ฐฐ ACMํฌ๋ž˜ํ”„ํŠธ ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค! ์ตœ๋ฐฑ์ค€์€ ํ™”๋ คํ•œ ์ปจํŠธ๋กค ์‹ค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ๊ธฐ์—์„œ ํŠน์ • ๊ฑด๋ฌผ๋งŒ ์ง“๋Š”๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒŒ์ž„์—์„œ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค.ย ๊ทธ๋Ÿฌ๋‚˜ ๋งค ๊ฒŒ์ž„๋งˆ๋‹ค ํŠน์ •๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ตœ๋ฐฑ์ค€์€ ์ขŒ์ ˆํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.ย ๋ฐฑ์ค€์ด๋ฅผ ์œ„ํ•ด ํŠน์ •๊ฑด๋ฌผ์„ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์ง€์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์ฃผ์ž.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค.ย ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฑด๋ฌผ๊ฐ„์˜ ๊ฑด์„ค์ˆœ์„œ ๊ทœ์น™์˜ ์ด ๊ฐœ์ˆ˜ K์ด ์ฃผ์–ด์ง„๋‹ค.ย (๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค)ย  ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ๋‹น ๊ฑด์„ค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ D1, D2, โ€ฆ, DN์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ์ฃผ์–ด์ง„๋‹ค.ย ์…‹์งธ ์ค„๋ถ€ํ„ฐ K+2์ค„๊นŒ์ง€ ๊ฑด์„ค์ˆœ์„œ X Y๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.ย (์ด๋Š” ๊ฑด๋ฌผ X๋ฅผ ์ง€์€ ๋‹ค์Œ์— ๊ฑด๋ฌผ Y๋ฅผ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค)ย  ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” ๋ฐฑ์ค€์ด๊ฐ€ ์Šน๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด์„คํ•ด์•ผย ํ•  ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ W๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

๊ฑด๋ฌผ W๋ฅผ ๊ฑด์„ค์™„๋ฃŒ ํ•˜๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.ย ํŽธ์˜์ƒ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๊ฑด์„ค์ˆœ์„œ๋Š” ๋ชจ๋“  ๊ฑด๋ฌผ์ด ๊ฑด์„ค ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฃผ์–ด์ง„๋‹ค.


์ œํ•œ

2ย โ‰ค N โ‰ค 1000 1 โ‰ค K โ‰ค 100,000 1 โ‰ค X, Y, W โ‰ค N 0 โ‰ค Di โ‰ค 100,000, Di๋Š” ์ •์ˆ˜


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

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


์˜ˆ์ œ 2

์ž…๋ ฅ

5
3 2
1 2 3
3 2
2 1
1
4 3
5 5 5 5
1 2
1 3
2 3
4
5 10
100000 99999 99997 99994 99990
4 5
3 5
3 4
2 5
2 4
2 3
1 5
1 4
1 3
1 2
4
4 3
1 1 1 1
1 2
3 2
1 4
4
7 8
0 0 0 0 0 0 0
1 2
1 3
2 4
3 4
4 5
4 6
5 7
6 7
7


์ถœ๋ ฅ

6
5
399990
2
0


My Sol

import sys
input = sys.stdin.readline
sys.setrecursionlimit(200000)

def calc_time(n):
    global build_first, times, is_built

    if is_built[n] != -1:
        return is_built[n]

    if not build_first[n]:
        return times[n]

    max_time = 0
    for first in build_first[n]:
        ret = calc_time(first)
        if max_time < ret:
            max_time = ret

    is_built[n] = max_time + times[n]
    return is_built[n]


T = int(input())
for _ in range(T):
    N, K = map(int, input().split())
    times = [0]+list(map(int, input().split()))
    build_first = [[] for _ in range(N + 1)]
    is_built = [-1]*(N+1)

    for _ in range(K):
        a, b = map(int, input().split())
        build_first[b].append(a)

    W = int(input())
    print(calc_time(W))

๊ณจ๋“œ 3์˜ ๋‚œ์ด๋„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์žฌ๊ท€์™€ memoization์„ ํ™œ์šฉํ•œ๋‹ค.

  1. ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, b๋ฅผ ์ง“๊ธฐ ์ „์— a๋ฅผ ์ง€์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— build_first[b]์˜ ์œ„์น˜์— a๋ฅผ appendํ•ด์ค€๋‹ค.
  2. W๋ฅผ ์ง“๋Š” ์‹œ๊ฐ„์ธ calc_time(W)๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๋ฐ, W๊ฐ€ ์ง€์–ด์ง€๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๋ฒˆํ˜ธ์˜ ๋ชฉ๋ก์ธ build_first[W]์˜ ๋ชฉ๋ก์˜ ๋ฒˆํ˜ธ๋“ค ์ค‘ ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ์ง“๊ธฐ๊นŒ์ง€ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ + W๋ฅผ ์ง“๋Š” ์‹œ๊ฐ„์ด๋‹ค.
  3. ๋งŒ์•ฝ ์–ด๋–ค ๋ฒˆํ˜ธ๋ฅผ ์ง“๊ธฐ ์ „์— ์‚ฌ์ „์— ์ง€์–ด์ ธ์•ผํ•˜๋Š” ๋ชฉ๋ก์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ฑด๋ฌผ์€ ๋ฐ”๋กœ ์ง€์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ times์—์„œ ๋ฐ”๋กœ ๋ฝ‘์•„์„œ returnํ•œ๋‹ค.
  4. ๋งŒ์•ฝ ์–ด๋–ค ๊ฑด๋ฌผ์ด ์ง€์–ด์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฒฐ์ •๋˜์—ˆ๋‹ค๋ฉด returnํ•˜๊ธฐ ์ „์— memoization ๋ฐฐ์—ด์ธ is_built์— ๊ธฐ๋กํ•œ๋‹ค.
  5. ์ด๋Š” ๋‹ค๋ฅธ ์žฌ๊ท€์—์„œ ํ•ด๋‹น ๊ฑด๋ฌผ์˜ ์ง“๋Š” ์‹œ๊ฐ„์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€์˜ ์—ฐ์†์„ ์žฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, is_built์—์„œ ๋ฐ”๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.


์ž…๋ ฅ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— import sys; input = sys.stdin.readline; ์œผ๋กœ ์ž…๋ ฅ์„ ๋น ๋ฅด๊ฒŒ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

๋˜ํ•œ ์ฃผ์˜ํ•  ์ ์€ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์ตœ์†Œ 0์ดˆ๋ผ๋Š” ๊ฒƒ์ด๊ณ , ์ด ๋•Œ๋ฌธ์— is_built์˜ ์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ๋‘์–ด ํŒ๋‹จํ–ˆ๋˜ ๊ฒƒ์ด ํŒจ์ธ์ด ๋˜์–ด ์—ฌ๋Ÿฌ ๋ฒˆ โ€˜ํ‹€๋ ธ์Šต๋‹ˆ๋‹คโ€™๋ฅผ ๋งˆ์ฃผํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ดˆ๊ธฐ๊ฐ’์„ -1๋กœ ๋‘์—ˆ๋‹ค.

๋˜ ํ•œ ๊ฐ€์ง€๋Š” ๋ฐ˜๋ณต์„ 10๋งŒ ํšŒ ์ด์ƒ ๋ฐ˜๋ณตํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ธฐ๋ณธ๊ฐ’์ธ recursionLimit์„ 20๋งŒ ํšŒ๋กœ ๋„‰๋„‰ํžˆ ์žฌ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ