์์์ ๋ ฌ(Topological Sorting) ์๊ณ ๋ฆฌ์ฆ
๐น ์์ ์ ๋ ฌ(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