๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.1005 ACM Craft ๋ฌธ์ œ ํ’€์ด

๐Ÿ“– ๋ฌธ์ œ

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

์„œ๊ธฐ 2012๋…„! ๋“œ๋””์–ด 2๋…„๊ฐ„ ์ˆ˜๋งŽ์€ ๊ตญ๋ฏผ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ ๊ฒŒ์ž„ ACM Craft (Association of Construction Manager Craft)๊ฐ€ ๋ฐœ๋งค๋˜์—ˆ๋‹ค.

์ด ๊ฒŒ์ž„์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๊ฒŒ์ž„๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ACMํฌ๋ž˜ํ”„ํŠธ๋Š” ๋‹ค์ด๋‚˜๋ฏนํ•œ ๊ฒŒ์ž„ ์ง„ํ–‰์„ ์œ„ํ•ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค.

์ฆ‰, ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์ž„๊ณผ ๋‘ ๋ฒˆ์งธ ๊ฒŒ์ž„์ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋งค ๊ฒŒ์ž„์‹œ์ž‘ ์‹œ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฑด๋ฌผ์€

๊ฐ๊ฐ ๊ฑด์„ค์„ ์‹œ์ž‘ํ•˜์—ฌ ์™„์„ฑ์ด ๋  ๋•Œ๊นŒ์ง€ Delay๊ฐ€ ์กด์žฌํ•œ๋‹ค.

example

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

์ด๋ฒˆ ๊ฒŒ์ž„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™์ด ์ฃผ์–ด์กŒ๋‹ค. 1๋ฒˆ ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์ด ์™„๋ฃŒ๋œ๋‹ค๋ฉด 2๋ฒˆ๊ณผ 3๋ฒˆ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค. (๋™์‹œ์— ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค)

๊ทธ๋ฆฌ๊ณ  4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์ด ๋ชจ๋‘ ๊ฑด์„ค ์™„๋ฃŒ๋˜์–ด์•ผ์ง€๋งŒ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์‹œ์ž‘ํ• ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ 4๋ฒˆ๊ฑด๋ฌผ์˜ ๊ฑด์„ค์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ฒ˜์Œ 1๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•˜๋Š”๋ฐ 10์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2๋ฒˆ ๊ฑด๋ฌผ๊ณผ 3๋ฒˆ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ๊ฑด์„คํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด

2๋ฒˆ์€ 1์ดˆ๋’ค์— ๊ฑด์„ค์ด ์™„๋ฃŒ๋˜์ง€๋งŒ ์•„์ง 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 4๋ฒˆ ๊ฑด๋ฌผ์„ ๊ฑด์„คํ•  ์ˆ˜ ์—†๋‹ค. 3๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋•Œ 4๋ฒˆ ๊ฑด๋ฌผ์„ ์ง€์„์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ

4๋ฒˆ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ธฐ๊นŒ์ง€๋Š” ์ด 120์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค.

ํ”„๋กœ๊ฒŒ์ด๋จธ ์ตœ๋ฐฑ์ค€์€ ์• ์ธ๊ณผ์˜ ๋ฐ์ดํŠธ ๋น„์šฉ์„ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•ด ์„œ๊ฐ•๋Œ€ํ•™๊ต๋ฐฐ ACMํฌ๋ž˜ํ”„ํŠธ ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค! ์ตœ๋ฐฑ์ค€์€ ํ™”๋ คํ•œ ์ปจํŠธ๋กค ์‹ค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ๊ธฐ์—์„œ

ํŠน์ • ๊ฑด๋ฌผ๋งŒ ์ง“๋Š”๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒŒ์ž„์—์„œ ์ด๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งค ๊ฒŒ์ž„๋งˆ๋‹ค ํŠน์ •๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ตœ๋ฐฑ์ค€์€ ์ขŒ์ ˆํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋ฐฑ์ค€์ด๋ฅผ ์œ„ํ•ด ํŠน์ •๊ฑด๋ฌผ์„

๊ฐ€์žฅ ๋นจ๋ฆฌ ์ง€์„ ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

boj Q.1005 ACM Craft ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์™€ ๊ฐ™์ด ๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™๋Œ€๋กœ

๋ฐ˜๋“œ์‹œ ์–ด๋–ค ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด ์„ ํ–‰ ๋˜์–ด์•ผํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์„ ํ–‰ ๋˜์–ด์•ผํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์ด ๋ชจ๋‘ ์ง€์–ด์ ธ์•ผ๋งŒ

๊ฑด์„ค์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฑด์„ค ์ˆœ์„œ ๊ทœ์น™์ด ๊ทธ๋ž˜ํ”„๋กœ ์ฃผ์–ด์ง€๊ณ  ์„ ํ–‰ ํ›„ํ–‰ ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ ๊ทธ ๊ด€๊ณ„๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์ ธ์•ผ ํ•˜๋ฏ€๋กœ

์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, ์ด ๋ฌธ์ œ๋Š” ์„ ํ–‰ ํ›„ํ–‰ ๊ด€๊ณ„๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์ด ์†Œ์š”์‹œ๊ฐ„์„ ๊ตฌํ•ด์•ผํ•˜๋ฏ€๋กœ

์†Œ์š”์‹œ๊ฐ„๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•œ ์„ ํ–‰ ๊ฑด๋ฌผ๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ง€์–ด์ ธ์•ผ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ

์„ ํ–‰ ๊ฑด๋ฌผ๋“ค ์ค‘ ๊ฐ€์žฅ ์˜ค๋ž˜ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜์•ผ๋งŒ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์„ ํ–‰ ๊ฑด๋ฌผ๋“ค ์ค‘ ๊ฐ€์žฅ ์˜ค๋ž˜ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ๋”ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

dp[next] = Math.max(dp[next],dp[current]+time[next]); 

๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์ค€์ด๊ฐ€ ์Šน๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑด์„คํ•ด์•ผ ํ•  ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

์ž„์˜์˜ ๋ฒˆํ˜ธ W์ด๋ฏ€๋กœ ๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•˜์—ฌ ํ’€์ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ


package problem.topological_sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Main_1005 {
    static int t,n,k,w;
    static int time[];
    static List<List<Integer>> adjList;
    static int depth[];
    static int dp[];
    static Queue<Integer> queue;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        input();
        System.out.println(sb.toString());
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        t= Integer.parseInt(br.readLine());
        for(int i=0 ;i<t; i++){
            adjList = new ArrayList<>();
            String[] temp = br.readLine().split(" ");
            n = Integer.parseInt(temp[0]);
            k = Integer.parseInt(temp[1]);
            time = new int[n+1];
            depth = new int[n+1];
            dp = new int[n+1];
            temp = br.readLine().split(" ");

            for (int j=0; j<=n; j++){
                adjList.add(new ArrayList<>());
            }

            for(int j=1; j<=n; j++){
                time[j] = Integer.parseInt(temp[j-1]);
                dp[j] = time[j];
            }
            for(int j=1; j<=k; j++){
                temp = br.readLine().split( " ");
                int u = Integer.parseInt(temp[0]);
                int v = Integer.parseInt(temp[1]);
                adjList.get(u).add(v);
                depth[v]++;
            }
            w = Integer.parseInt(br.readLine());
            solve();
        }
        br.close();
    }

    private static void solve(){
        queue = new LinkedList<>();
        for(int i=1; i<=n; i++){
            if(depth[i] == 0){
                queue.offer(i);
            }
        }
        while (! queue.isEmpty()){
            int current = queue.poll();
            if(current == w) {
                sb.append(dp[w]+"\n");
                return;
            }
            for(int next : adjList.get(current)){
                depth[next]--;
                if(depth[next] == 0){
                    queue.offer(next);
                }
                dp[next] = Math.max(dp[next],dp[current]+time[next]);
            }
        }
    }
}


Written on April 13, 2021