Algorithm

์œ„์ƒ์ •๋ ฌ(Topological Sorting) ์•Œ๊ณ ๋ฆฌ์ฆ˜

jeong_ii 2024. 1. 12. 16:47

๐Ÿ”น ์œ„์ƒ ์ •๋ ฌ(Topological Sorting) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ?

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

 

์˜ˆ๋ฅผ ๋“ค์–ด,

์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

ํ‘œ์™€ ๊ฐ™์ด ์ด 3๊ฐœ์˜ ๊ณผ๋ชฉ์ด ์žˆ๋‹ค.

3๊ฐœ์˜ ๊ณผ๋ชฉ์„ ๋ชจ๋‘ ๋“ฃ๊ธฐ ์œ„ํ•ด ์ž๋ฃŒ๊ตฌ์กฐ โžก ์•Œ๊ณ ๋ฆฌ์ฆ˜ โžก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆœ์„œ๋กœ ๊ณผ๋ชฉ์„ ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ์ž๋ฃŒ๊ตฌ์กฐ โžก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค  โžก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆœ์„œ๋กœ ๊ณผ๋ชฉ์„ ๋“ฃ๋Š”๋‹ค๋ฉด ๊ทธ๊ฑด ์˜ฌ๋ฐ”๋ฅธ ํ•™์Šต ์ˆœ์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

๐Ÿ”น ์ง‘์ž…์ฐจ์ˆ˜์™€ ์ง„์ถœ์ฐจ์ˆ˜

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

 

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

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

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

 

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

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

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

 


 

์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ๋™์ž‘๊ณผ์ •์„ ์ดํ•ดํ•ด ๋ณด์ž.

์œ„ ๊ทธ๋ฆผ์€ ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์ด๋•Œ, ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋Š” ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„์—ฌ์•ผ ํ•œ๋‹ค. (์ผ๋ฐฉํ–ฅ์„ฑ)

 

[ ๊ณผ์ • 0 ]

  • ์ง‘์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋ชจ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  • ํ˜„์žฌ 1๋ฒˆ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๋งŒ 0์ด๋ฏ€๋กœ ํ์— 1๋ฒˆ ๋…ธ๋“œ๋งŒ ์‚ฝ์ž…ํ•˜๊ฒŒ ๋œ๋‹ค.

 

[ ๊ณผ์ • 1 ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   1   1   2   1   2   1
  ํ   ๋…ธ๋“œ 1
  • ํ์— ์žˆ๋Š” 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • ๊ทธ ํ›„, 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • 2๋ฒˆ ๋…ธ๋“œ์™€ 5๋ฒˆ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๋Š” 0์ด ๋˜๊ณ , ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ 2๋ฒˆ ๋…ธ๋“œ์™€ 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

[ ๊ณผ์ • 2 ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   1   2   0   2   1
  ํ   ๋…ธ๋“œ 2, ๋…ธ๋“œ 5
  • ํ์— ์žˆ๋Š” 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • 2๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • 3๋ฒˆ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๊ณ , ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ 3๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

[ ๊ณผ์ • 3 ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   2   0   1   1
  ํ   ๋…ธ๋“œ 5, ๋…ธ๋“œ 3
  • ํ์— ์žˆ๋Š” 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • 5๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • 6๋ฒˆ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๊ณ , ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

[ ๊ณผ์ • 4 ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   2   0   0   1
  ํ   ๋…ธ๋“œ 3, ๋…ธ๋“œ 6
  • ํ์— ์žˆ๋Š” 3๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • 3๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

[ ๊ณผ์ • 5 ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   1   0   0   1
  ํ   ๋…ธ๋“œ 6
  • ํ์— ์žˆ๋Š” 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • 6๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • 4๋ฒˆ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๊ณ , ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

[ ๊ทธ ์™ธ ๊ณผ์ • ]

  ๋…ธ๋“œ   1   2   3   4   5   6   7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   0   0   0   1
  ํ   ๋…ธ๋“œ 4
  • ์œ„์™€ ๋™์ผํ•œ ๋กœ์ง์œผ๋กœ ํ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด๊ณ , ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

  ๋…ธ๋“œ   1   2   3   4   5   6  7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   0   0   0  0
  ํ   ๋…ธ๋“œ 7

  ๋…ธ๋“œ   1   2   3   4   5   6  7
  ์ง„์ž…์ฐจ์ˆ˜   0   0   0   0   0   0  0
  ํ   

 

[ ๊ฒฐ๊ณผ ]

1 โžก 2 โžก 5 โžก 3 โžก 6 โžก 4 โžก 7

 

โ€ป ์œ„์ƒ ์ •๋ ฌ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 1 โžก 5 โžก 2 โžก 3 โžก 6 โžก 4 โžก 7 ๋„ ํ•˜๋‚˜์˜ ๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น ์œ„์ƒ ์ •๋ ฌ ํŠน์ง•

  • ์œ„์ƒ ์ •๋ ฌ์€ ์‚ฌ์ดํด์ด ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(DAG)์— ๋Œ€ํ•ด์„œ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • DAG(Direct Acyclic Graph) : ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„, ์ˆœํ™˜ํ•˜๋Š” ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐฉํ–ฅ์„ฑ๋งŒ ๊ฐ€์ง„๋‹ค.
  • ์œ„์ƒ ์ •๋ ฌ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•œ ๋‹จ๊ณ„์—์„œ ํ์— ์ƒˆ๋กญ๊ฒŒ ๋“ค์–ด๊ฐ€๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „ ํ๊ฐ€ ๋นˆ๋‹ค๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์ดํด์— ํฌํ•จ๋œ ๋…ธ๋“œ ์ค‘์—์„œ ํ•ด๋‹น๋˜๋Š” ์–ด๋– ํ•œ ๋…ธ๋“œ๋„ ํ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋‚˜, ์Šคํƒ์„ ์ด์šฉํ•œ DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ’ญ Java  Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class sort {
    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[] edgeCount = 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);
            edgeCount[num2]++;
        }
        // ์œ„์ƒ ์ •๋ ฌ
        Queue<Integer> que = new LinkedList<>();
        // ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๊ฐ’ ํ์— ๋„ฃ๊ธฐ
        for (int i = 1; i <= n; i++) {
            if (edgeCount[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++) {
                // ์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜ 1 ๊ฐ์†Œ
                edgeCount[list.get(i)]--;
                // ๊ฐฑ์‹ ๋œ ๋…ธ๋“œ์˜ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด๋ฉด ํ์— ๋‹ด๊ธฐ
                if (edgeCount[list.get(i)] == 0) {
                    que.offer(list.get(i));
                }
            }
        }
        System.out.println(sb);
    }
}

/* sample input
7 8
1 2
1 5
2 3
2 6
3 4
4 7
5 6
6 4
*/

 

 

 

 

 

๐Ÿ“ƒ reference