Algorithm/BOJ

[Boj_2252] ์ค„ ์„ธ์šฐ๊ธฐ

jeong_ii 2024. 1. 11. 22:30

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

2252๋ฒˆ: ์ค„ ์„ธ์šฐ๊ธฐ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. M์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŒ์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” ํ•™์ƒ A๊ฐ€ ํ•™์ƒ B์˜ ์•ž์— ์„œ์•ผ ํ•œ๋‹ค๋Š” ์˜

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

N๋ช…์˜ ํ•™์ƒ๋“ค์„ ํ‚ค ์ˆœ์„œ๋Œ€๋กœ ์ค„์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ ํ•™์ƒ์˜ ํ‚ค๋ฅผ ์ง์ ‘ ์žฌ์„œ ์ •๋ ฌํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒ ์ง€๋งŒ, ๋งˆ๋•…ํ•œ ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ๋‘ ํ•™์ƒ์˜ ํ‚ค๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๊ทธ๋‚˜๋งˆ๋„ ๋ชจ๋“  ํ•™์ƒ๋“ค์„ ๋‹ค ๋น„๊ตํ•ด ๋ณธ ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์ผ๋ถ€ ํ•™์ƒ๋“ค์˜ ํ‚ค๋งŒ์„ ๋น„๊ตํ•ด ๋ณด์•˜๋‹ค.

์ผ๋ถ€ ํ•™์ƒ๋“ค์˜ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ค„์„ ์„ธ์šฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. M์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŸ์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” ํ•™์ƒ A๊ฐ€ ํ•™์ƒ B์˜ ์•ž์— ์„œ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ•™์ƒ๋“ค์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ค„์„ ์„ธ์šด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด๊ฑฐ๋‚˜ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ์œ„์ƒ ์ •๋ ฌ, ๋ฐฉํ–ฅ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

  • ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋จผ์ €, ์œ„์ƒ ์ •๋ ฌ์— ์‚ฌ์šฉ ํ•  ์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ๊ฐ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๋ฅผ ์ €์žฅ ํ•  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค.
  • ํ๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ๋‹ด์•„์ฃผ์—ˆ๋‹ค.
  • ํ๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ์•„๋ž˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ํ์—์„œ ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ด๊ณ  ์ •๋‹ต ์ถœ๋ ฅ์— ์ด์šฉํ•  StringBuilder์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ํ˜„์žฌ ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๋ฅผ 1์”ฉ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.
    • ๊ฐฑ์‹ ๋œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด๋ผ๋ฉด ๋‹ค์‹œ ํ์— ๋„ฃ์–ด์ค€๋‹ค.

 

๐Ÿ” ์œ„์ƒ ์ •๋ ฌ์ด๋ž€(Topology Sort) ?

  • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ์ข…์œผ๋กœ, ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉํ–ฅ์„ฑ์— ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ง„์ž…์ฐจ์ˆ˜์™€ ์ง„์ถœ์ฐจ์ˆ˜

  • ์ง„์ž…์ฐจ์ˆ˜(Indegree) : ํŠน์ •ํ•œ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
  • ์ง„์ถœ์ฐจ์ˆ˜(Outdegree) : ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ๋‚˜๊ฐ€๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜

์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •

์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณดํ†ต ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

[ ๋™์ž‘ ๊ณผ์ • ]

  • ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.
  • ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. 
    • ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋‚˜๊ฐ€๋Š” ๊ฐ„์„ ์„ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
    • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋œ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค. 

์ฆ‰, ๊ฐ ๋…ธ๋“œ๊ฐ€ ํ์— ๋“ค์–ด์˜จ ์ˆœ์„œ๊ฐ€ ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

 

๋” ์ž์„ธํ•œ ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ๋Š” ํด๋ฆญ !

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 44632 KB
์‹œ๊ฐ„ : 428 ms
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // ํ•™์ƒ์˜ ์ˆ˜
        int m = Integer.parseInt(st.nextToken()); // ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŸ์ˆ˜
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>(); // ์œ„์ƒ ์ •๋ ฌ์— ์‚ฌ์šฉํ•  ๊ทธ๋ž˜ํ”„
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        int[] edgeCout = new int[n+1]; // ์œ„์ƒ ์ •๋ ฌ์— ์‚ฌ์šฉํ•  ์ง„์ž…์ฐจ์ˆ˜ ์ €์žฅ ๋ฐฐ์—ด
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int num1 = Integer.parseInt(st.nextToken());
            int num2 = Integer.parseInt(st.nextToken());
            graph.get(num1).add(num2);
            edgeCout[num2]++;
        }
        
        Queue<Integer> que = new LinkedList<>();
        // ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๊ฐ’ ํ์— ๋„ฃ๊ธฐ
        for (int i = 1; i <= n; i++) {
            if (edgeCout[i] == 0) que.offer(i);
        }

        while (!que.isEmpty()) {
            int node = que.poll();

            sb.append(node).append(" ");

            // ๊บผ๋‚ธ ๋…ธ๋“œ์˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ฐพ๊ธฐ
            List<Integer> list = graph.get(node);
            for (int i = 0; i < list.size(); i++) {
                // ์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜ ๊ฐ์†Œ
                edgeCout[list.get(i)]--;
                // ๊ฐฑ์‹ ๋œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด๋ฉด ํ์— ๋‹ด๊ธฐ
                if (edgeCout[list.get(i)] == 0) {
                    que.offer(list.get(i));
                }
            }
        }
        System.out.println(sb);
    }
}

 

๐Ÿ‘ง๐Ÿป๐Ÿ’ญ : ๋‚˜ํƒœ๋ณ‘์— ๊ฑธ๋ ค ๊ฑฐ์˜ ํ•œ๋‹ฌ๋งŒ์— ํ•˜๋Š” ํฌ์ŠคํŒ…์ด๋‹ค.. ๋ฐ˜์„ฑํ•˜๊ณ  ๋” ๋ถ€์ง€๋Ÿฐํžˆ ์‚ด์•„์•ผ์ง€..! ๋ฝœ์ดํŒ… ๐Ÿ˜‚๐Ÿ’ช๐Ÿป