* μ΄ κΈμ μκ³ λ¦¬μ¦μ κ΄ν΄ νμ΅νλ©° μ 리ν κΈμ λλ€. νλ¦° μ μ΄λ, κ³ μ³μΌ ν λΆλΆμ΄ μμΌλ©΄ μλ €μ£ΌμΈμ..!
μμ μ λ ¬μ΄λ?
- μμ μ λ ¬μ΄λ(Topological Sort) : μ¬μ΄ν΄μ΄ μλ λ°©ν₯ κ·Έλν(Directed Acyclic Graph, DAG)μμ μ μ μ μ νμμλ‘ λμ΄νλ κ²μ΄λ€.
μ΄λ DAG, μ¦ μ¬μ΄ν΄μ΄ μλ λ°©ν₯ κ·Έλνλ μ£Όλ‘ λ Έλλ€ κ°μ μ°μ μμλ₯Ό λνλ΄κΈ° μν΄μ μ¬μ©νλ€. λ§μ½ λ Έλλ€κ°μ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ€λ©΄, DAGλΌκ³ λ³Ό μ μλ€.
μ¦, μ°μ μμκ° μ‘΄μ¬νλ λ Έλλ€ κ°μ μμλ₯Ό λνλΈ κ²μΈλ°, λ§μ½ μ°μ μμκ° λμΌνλ€λ©΄ κ·Έ μ€ μμμ νλλ₯Ό μ ννλ€. κ·Έλμ μμ μ λ ¬μ μ¬λ¬ κ°μ΄ λμ¬ μ μλ€.
μΌλ°μ μΌλ‘ μμ μ λ ¬μ μ¬μ©νλ λλ μμ‘΄ κ΄κ³κ° μ‘΄μ¬ν λ, μν κ°λ₯ν μμ μμλ₯Ό λμννκΈ° μν΄ μ¬μ©νλ€. μμ‘΄ κ΄κ³κ° λ°λ‘ λ Έλμ λ Έλ μ¬μ΄μ κ°μ κ³Ό κ·Έ λ°©ν₯μ΄ λκΈ° λλ¬Έμ΄λ€.
μμ μ λ ¬μ ꡬνμ μν΄ μμμΌ νλ κ²
κ°λ μ μμμΌλ, μμ μ λ ¬μ μννκΈ° μν΄μλ μ΄λ€ λ¨κ³λ₯Ό κ±°μ³μΌ νλ μ§ νμ ν΄μΌ νλ€.
μ΄λ₯Ό μν΄ κΈ°λ³Έμ μΈ μ°¨μμ κ°λ μ μμ§ν νμκ° μλ€.
μ°¨μλ μ μ μ μΈμ ν μ μ μ μλ₯Ό λ§νλ€. μ μ μ λ ΈλλΌκ³ 보μλ μ’λ€. κ²°κ΅ νλμ μ μ κ·Όμ²μ μλ μ μ λ€μ 보λ κ²μΈλ°, μ΄ μ μ λ€κ°μλ μλ‘ λ°©ν₯μ΄ μ‘΄μ¬νλ κ·Έλνλ μλ€. κ·Έλμ, μ μ λ€κ°μ λ°©ν₯μ λ°λΌ μ°¨μλ₯Ό λΆλ₯΄λ λ§λ λλλ€.
λ¨Όμ , μΈμ ν μ μ μμ μ£Ό μ μ μΌλ‘ λ€μ΄μ€λ κ²μ μμ μ§μ μ°¨μ(In-degree)λΌκ³ νκ³ , μ£Ό μ μ μμ μΈμ ν μ μ μΌλ‘ λκ°λ κ²μ μλ₯Ό μ§μΆ μ°¨μ(out-degree)λΌκ³ νλ€.
μλ₯Ό λ€μ΄, μλμ κ·Έλ¦Όκ³Ό κ°μ κ·Έλνκ° μλ€λ©΄, aμ μ§μΆ μ°¨μλ 2μ΄κ³ μ§μ μ°¨μλ 1μ΄λΌκ³ λ³Ό μ μλ€.
λ€μμΌλ‘ μμμΌ ν κ²μ DFS κ°λ μ΄λ€. λ¬Όλ‘ , μμ μ λ ¬μ BFSμ DFSλ‘ λͺ¨λ ꡬνν μ μμ§λ§, μ΄λ² μμ μ λ ¬μμλ DFSλ₯Ό μ¬μ©νμ¬ κ΅¬νν κ²μ΄λ€.
κ°λ¨νκ² DFSλ₯Ό μ€λͺ νμλ©΄, DFSλ μμμ μ μ μμ μμνμ¬ μ΄μνλ νλμ μ μ μ λ°©λ¬Ένκ³ , κ·Έ μ μ μ μ΄μμ μ μ λ°©λ¬Ένλ©°, λͺ¨λ λ°©λ¬Ένλ©΄ λ€μ λλμκ° νμμ μννλ λ°©μμ΄λ€.
λλλ§μΌλ‘ 보면, 꼬리μ 꼬리λ₯Ό 무λ μμΌλ‘ λ°©κΈ λ°©λ¬Έν μ΄μμ μ΄μμ μ¬κ·μ μΌλ‘ νμνλ κ²κ³Ό κ°λ€. μ€μ λ‘λ μ¬κ·ν¨μλ₯Ό ν΅ν΄ ꡬννλ νΈμ΄λ€.
DFSμ λν λμ± μμΈν μ€λͺ μ λ€λ₯Έ ν¬μ€ν μμ μ°Έκ³ νκΈΈ λ°λΌλ©°, μ΄μ μμ μ λ ¬μ μ§μ ꡬνν΄ λ³Ό μ°¨λ‘μ΄λ€.
μμ μ λ ¬μ ꡬν
μΌλ°μ μΌλ‘ λ κ°μ§ λ°©λ²μ΄ μλ€.
1. κ·Έλνμμ μ§μ μ°¨μκ° 0μΈ μ μ vλ‘λΆν° μμνμ¬ vλ₯Ό μΆλ ₯νκ³ vλ₯Ό κ·Έλνμμ μ κ±°νλ κ³Όμ μ λ°λ³΅νλ μλ°©ν₯ λ°©λ².
2. μ§μΆμ°¨μκ° 0μΈ μ μ vλ₯Ό μΆλ ₯νκ³ vλ₯Ό κ·Έλνμμ μ κ±°νλ κ³Όμ μ λ°λ³΅νμ¬ μ»μ μΆλ ₯ 리μ€νΈλ₯Ό μμμΌλ‘ λ§λ€μ΄ κ²°κ³Όλ₯Ό μ»λ λ°©λ².
μ°λ¦¬λ μ΄ μλ°©ν₯ λ°©λ²μ DFSμ ν¨κ» μ¬μ©νμ¬ μ½κ² ꡬνν κ²μ΄λ€. ν΅μ¬ μμ΄λμ΄λ DFSμ΄λ€. κ·Έ κ°λ μ λ€μ νλ² λ μ¬λ¦¬λ©΄, μ΄μμ μ΄μμ μ΄μμ... λλμΌλ‘ κ³μ νκ³ λ λ€. μ΄λ μ μΌ μ²μμ μ μ μ΄ μΆκ°λκΈ° μ΄μ μ κ·Έ μ΄μλ€μ λͺ¨λ μΆκ°ν μ μλ€λ λ»μ΄ λλ€. μ΄λ° λ°©μμ μ μ©ν 리μ€νΈλ₯Ό μμμΌλ‘ λ€μ§κΈ°λ§ νλ©΄ μ μΌ μ²μμ μ μ μ΄ μ²« λ²μ§Έ μμΉμ μ€κ² λμ΄ μμ μ λ ¬μ λ§λ€ μ μλ€.
μλ μλ° μΈμ΄λ‘ ꡬνλ μμ μ λ ¬ μ½λλ₯Ό 보면, λ¬΄μ¨ λ§μΈ μ§ μ½κ² μ μ μμ κ²μ΄λ€.
class TopologicalSort {
int N;
// λ°©λ¬Έν λ°°μ΄μ λν΄ νμ
boolean[] visited;
// μΈμ 리μ€νΈ(μ μ μ λν μΈμ μ μ λ€ λ¦¬μ€νΈ)
List<Integer>[] adjList;
// μμμ λ ¬ κ²°κ³Ό 리μ€νΈ
List<Integer> sequence;
// μ΄κΈ°ν
public TopologicalSort(List<Integer>[] graph) {
N = graph.length;
visited = new boolean[N];
adjList = graph;
sequence = new ArrayList<>();
}
// μμ μ λ ¬ μν
public List<Integer> tsort() {
for(int i=0; i<N; i++) if (!visited[i]) dfs(i);
// μ λ΅ λ¦¬μ€νΈ μμμΌλ‘ λ€μ§μ
Collections.reverse(sequence);
return sequence;
}
// dfs: λ°©λ¬Έν λ°°μ΄μ trueλ‘ μ€μ ν΄μ£Όκ³ , μΈμ 리μ€νΈμ λ°©λ¬Έ
public void dfs(int i) {
visited[i] = true;
for(int v: adjList[i]) {
if (!visited[v]) dfs(v);
}
// μ¬κΈ°κ° μ μΌ μ€μ. μ΄ κ΅¬κ°μ μμΉνλ©΄, κ°μ₯ λ§μ§λ§μΌλ‘ λ°©λ¬Ένλ μ μ μ΄ λ¨Όμ μΆκ°λλ€.
sequence.add(i);
}
}
μ΄μ λν main ν¨μ ꡬν μμ μ΄λ€.
import java.util.*;
public class Main {
public static void main(String[] args) {
int N = 9;
List<Integer>[] adjList = new List[N];
for (int i = 0; i < N; i++) {
adjList[i] = new ArrayList<>();
}
adjList[2].add(0); adjList[2].add(1); adjList[0].add(1);
adjList[1].add(3); adjList[1].add(4); adjList[4].add(5);
adjList[5].add(3); adjList[5].add(7); adjList[3].add(6);
adjList[6].add(7); adjList[7].add(8);
TopologicalSort t = new TopologicalSort(adjList);
List<Integer> sortedSeq = t.tsort();
System.out.printf("μμ μ λ ¬: ");
System.out.println(sortedSeq);
}
}
κ²°κ³Ό κ°μ μλμ κ°λ€.
μμ μ λ ¬μ μν μκ°
μμ μ λ ¬μ μ€μ λ‘ DFSλ₯Ό μννλ μκ°κ³Ό λμΌνκ² O(n+m)λ§νΌ μμλλ€.
λμΌν μ΄μ λ μ€μ§μ μΌλ‘ μ μ μ μ λ΅ λ¦¬μ€νΈμ μΆκ°νλ μκ°κ³Ό 리μ€νΈλ₯Ό μμμΌλ‘ λ§λλ μκ°μ΄ O(n)μ΄κΈ° λλ¬Έμ΄λ€.
O(n+m) = O(n+m) + O(n) μ΄ μ±λ¦½νκΈ°μ μμ μ λ ¬μ μν μκ°μ O(n+m)μ΄λ€.
'π Knowledge > μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] κ° μ°κ²° μ±λΆ(SCC) - Kosaraju, Tarjan μκ³ λ¦¬μ¦ (1) | 2023.10.14 |
---|---|
[μκ³ λ¦¬μ¦] Biconnect Component : μ΄μ€ μ°κ²° μ±λΆ (0) | 2023.10.12 |
[μκ³ λ¦¬μ¦] μ λμ¨κ³Ό νμΈλ μκ³ λ¦¬μ¦(union, find) (0) | 2023.09.07 |
[μκ³ λ¦¬μ¦] λ€μν μ νμ κ·Έλν λ¬Έμ λ€ (1) | 2023.09.04 |
[μκ³ λ¦¬μ¦] μ μλ‘ - μ€μΌλ¬ νΌμ μ ν΄λ¦¬λ νΈμ λ² (0) | 2023.09.01 |