[BOJ] ๊ฒŒ์ž„ ๊ฐœ๋ฐœ - ๋ฐฑ์ค€ 1516 (JAVA) - ์œ„์ƒ ์ •๋ ฌ

    ๐Ÿ“Œ ์œ„์ƒ ์ •๋ ฌ

    ์œ„์ƒ ์ •๋ ฌ(topology sort)๋Š” ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ๋…ธ๋“œ ์ˆœ์„œ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

     

    ex)  A๋Š” B๋ณด๋‹ค, C๋Š” D๋ณด๋‹ค, B๋Š” D๋ณด๋‹ค ์•ž์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.  

    ๊ฐ€๋Šฅํ•œ ์œ„์ƒ ์ •๋ ฌ -> (A B C D), (A C B D)

     

    ์œ„์™€ ๊ฐ™์ด ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์—์„œ ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•ญ์ƒ ์œ ์ผํ•œ ๊ฐ’์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

     

    ์ง„์ž… ์ฐจ์ˆ˜(in-degree) ๋ž€ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—์ง€์˜ ๊ฐœ์ˆ˜๋‹ค.

     

    ๐Ÿ‘† ์ง„์ž… ๋ฐฐ์—ด ์—…๋ฐ์ดํŠธ

     

    ๋…ธ๋“œ๊ฐ€ ์ด 5๊ฐœ, ์—์ง€๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด 6๊ฐœ, ์ง„์ž… ์ฐจ์ˆ˜ ๋ฐฐ์—ด์„ indegree[] ๋ผ๊ณ  ํ•  ๋•Œ

    1 -> 2, 3  ์ด ๋•Œ ์ง„์ž…์ฐจ์ˆ˜ ๊ฐ’ ๊ณ„์‚ฐ indegree[2]++, indegree[3]++

    2 -> 4, 5  indegree[4]++, indegree[5]++

    3 -> 4  indegree[4]++

    4 -> 5  indegree[5]++

     

    indegree[1] = 0,

    indegree[2] = indegree[3] = 1,

    indegree[4] = indegree[5] = 2

     

    โœŒ๏ธ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๊ณ  poll์„ ํ•˜์—ฌ ์œ„์ƒ ์ •๋ ฌ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ ํ›„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์—์„œ ์„ ํƒ๋œ ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜๋ฅผ 1์”ฉ ๋บ€๋‹ค.

     

    queue.add(1);

    queue.poll(1);

    indegree[2]--;

    indegree[3]--;

    ๋‹ค์‹œ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์œผ๋ฉฐ ์œ„ ๊ณผ์ •์„ ํ์— ๊ฐ’์ด ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

     

    ์•„๋ž˜๋Š” N๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ , arr ๋ฐฐ์—ด์— ์ธ์ ‘๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , result ๋ฐฐ์—ด๋กœ ์œ„์ƒ์ •๋ ฌ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ์œ„์ƒ์ •๋ ฌ ๋ฉ”์„œ๋“œ ์ฝ”๋“œ์ด๋‹ค.

     

    static void topoplogySort(){
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 1; i <= N ; i++) {
            if(indegree[i] == 0){
                queue.add(i);
                result.add(i); 
            }
        }
        while(!queue.isEmpty()){
            int now = queue.poll();
            for (Integer i : arr[now]) {
                indegree[i]--;
                if(indegree[i] == 0){
                    queue.add(i);
                    result.add(i);
                }
            }
        }
     }

     

    ๐Ÿ”’ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ - ๋ฐฑ์ค€ 1516

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

     

    ๋ฌธ์ œ

    ์ˆŒ ํšŒ์‚ฌ์—์„œ ์ด๋ฒˆ์— ์ƒˆ๋กœ์šด ์ „๋žต ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„ ์„ธ์ค€ ํฌ๋ž˜ํ”„ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ด ๋๋‚œ ์ƒํƒœ๊ณ , ์ข…์กฑ๋ณ„ ๊ท ํ˜•๊ณผ ์ „์ฒด ๊ฒŒ์ž„ ์‹œ๊ฐ„ ๋“ฑ์„ ์กฐ์ ˆํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‚จ์•„ ์žˆ์—ˆ๋‹ค.

     

    ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์— ๋“ค์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์˜ ์‹œ๊ฐ„์„ ์ด์šฉํ•˜์—ฌ ๊ทผ์‚ฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋ฌผ๋ก , ์–ด๋–ค ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๊ฑด๋ฌผ์„ ๋จผ์ € ์ง€์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋‹จ์ˆœํ•˜์ง€๋งŒ์€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ์—์„œ ๋ฒ™์ปค๋ฅผ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ๋Ÿญ์„ ๋จผ์ € ์ง€์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ๋Ÿญ์„ ๋จผ์ € ์ง€์€ ๋’ค ๋ฒ™์ปค๋ฅผ ์ง€์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

     

    ํŽธ์˜์ƒ ์ž์›์€ ๋ฌดํ•œํžˆ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ธฐ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

     

    ์ž…๋ ฅ

    ์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ์ข…๋ฅ˜ ์ˆ˜ N(1 ≤ N ≤ 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๊ทธ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€๋กœ ํ•˜๊ณ , ๊ฐ ์ค„์€ -1๋กœ ๋๋‚œ๋‹ค๊ณ  ํ•˜์ž. ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋ชจ๋“  ๊ฑด๋ฌผ์„ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

     

    ์ถœ๋ ฅ

    N๊ฐœ์˜ ๊ฐ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

    ๐Ÿ”‘ ํ•ต์‹ฌ ์•„์ด๋””์–ด

    • ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์‹œ๊ฐ„ ๋ฐฐ์—ด, ์ง„์ž… ์ฐจ์ˆ˜ ๋ฐฐ์—ด, ์ •๋‹ต ๋ฐฐ์—ด (๋จผ์ € ์ง€์–ด์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค ์ง“๋Š” ์‹œ๊ฐ„ ํ•ฉ + ํ•ด๋‹น ๊ฑด๋ฌผ ์ง“๋Š” ์‹œ๊ฐ„) ์ƒ์„ฑ
    • ์ •๋‹ต ๋ฐฐ์—ด ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฒ•

    ์œ„์ƒ ์ •๋ ฌ for๋ฌธ ์•ˆ์—์„œ (์ด์ „ ๊ฑด๋ฌผ์— ์ €์žฅ๋œ ์ตœ๋Œ€ ์‹œ๊ฐ„ + ์ด์ „ ๊ฑด๋ฌผ ์ง“๋Š” ์‹œ๊ฐ„) ๊ณผ ํ˜„์žฌ ๊ฑด๋ฌผ ์ •๋‹ต ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์‹œ๊ฐ„ ์ค‘ ํฐ ๊ฐ’์œผ๋กœ ์ •๋‹ต ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•œ๋‹ค. 

    ๋งˆ์ง€๋ง‰์— ์ž๊ธฐ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋”ํ•ด์ฃผ๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

     

    ์ง๊ด€์ ์œผ๋กœ๋Š” ๋‹น์—ฐํžˆ ์ „์ž๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•„๋‹ˆ๋‹ค.

     

    ๋ฐ˜๋ก€)

     

    1, 2 ๊ฑด๋ฌผ ์ง“๊ณ  3 ๊ฑด๋ฌผ์„ ์ง€์–ด์•ผ ํ•˜๊ณ , ๊ฐ๊ฐ 30, 10, 10 ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

    1, 2์˜ ์ง„์ž… ์ฐจ์ˆ˜๋Š” 0์ด๊ณ , ๋‘˜ ๋‹ค ์ธ์ ‘ ๋…ธ๋“œ๋กœ 3์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    1์„ ๋จผ์ € ํ์— ๋„ฃ์œผ๋ฉด 3์˜ ์ •๋‹ต ๋ฐฐ์—ด์€ 30์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  2๋ฅผ ํ์— ๋„ฃ์œผ๋ฉด 3์˜ ์ •๋‹ต ๋ฐฐ์—ด์„ ์ „์ž๋กœ๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉด 10์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. 

     

    ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ •๋‹ต ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์‹œ๊ฐ„์ด ๋” ํฌ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ ํ•ด์ค˜๋„ ๋œ๋‹ค.

     

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int N = sc.nextInt();
            ArrayList<ArrayList<Integer>> arr = new ArrayList<>();
            for (int i = 0; i <= N ; i++) {
                arr.add(new ArrayList<>());
            }
    
            int[] time = new int[N+1]; // ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
            int[] indegree = new int[N+1]; // ์ง„์ž… ์ฐจ์ˆ˜ ๋ฐฐ์—ด
            int[] ans = new int[N+1]; // ์ •๋‹ต ๋ฐฐ์—ด
    
            for (int i = 1; i <= N; i++) {
                time[i] = sc.nextInt();
                int node = sc.nextInt();
                while(node != -1){
                    arr.get(node).add(i);
                    indegree[i]++;
                    node = sc.nextInt();
                }
            }
    
            // ์œ„์ƒ ์ •๋ ฌ
            Queue<Integer> queue = new LinkedList<>();
            for (int i = 1; i <= N ; i++) {
                if(indegree[i] == 0)
                    queue.add(i);
            }
            while(!queue.isEmpty()){
                int now = queue.poll();
                for (Integer i : arr.get(now)) {
                    indegree[i]--;
                    ans[i] = Math.max(ans[now] + time[now], ans[i]); 
                    if(indegree[i] == 0)
                        queue.add(i);
                }
            }
            for (int i = 1; i <= N ; i++) {
                System.out.println(ans[i]+time[i]);
            }
    
        }
    
    }

     

     


    ์ฝ”ํ…Œ ์ •๋ฆฌ ๊นƒํ—ˆ๋ธŒ ๋งํฌ

     

    GitHub - HyperAlgorithmStudy/BaekJoon: Do it! ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์Šคํ„ฐ๋””

    Do it! ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์Šคํ„ฐ๋””. Contribute to HyperAlgorithmStudy/BaekJoon development by creating an account on GitHub.

    github.com

    ์ฐธ๊ณ : Do it! ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ: ์ž๋ฐ” ํŽธ - ๊น€์ข…๊ด€

    728x90

    ๋Œ“๊ธ€