์์์ ๋ ฌ์ด๋, ๊ทธ๋ํ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด๋ค.
์ด ๋ ๊ทธ๋ํ๋ DAG ๊ทธ๋ํ์ฌ์ผ ํ๊ณ , ์ ๋ ฌ ๊ธฐ์ค์ ์ง์
์ฐจ์์ ๋น๋ด๋ฆผ์ฐจ์์ด๋ค.
๋น๋ด๋ฆผ์ฐจ์(nondecreasing order)์ด๋, ๋ง ๊ทธ๋๋ก ๋ด๋ฆผ์ฐจ์์ด ์๋ ๊ฒ์ ๋งํ๋ค. ์ค๋ฆ์ฐจ์์ด์ง๋ง ํน์ ์์(๊ฐ์ด ๊ฐ์ ์์๋ค)์ ๋ํด์๋ ์ค๋ฆ์ฐจ์์ด ์๋ ์๋ ์๋ค๋ ๊ฒ์ด๋ค.
DAG ๊ทธ๋ํ, ์ง์ ์ฐจ์์ ๋น๋ด๋ฆผ์ฐจ์ ๋ฑ ์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง ์ข ๋ ์ธ์ธํ๊ฒ ์์๋ณด์.
- ๋ง ๊ทธ๋๋ก ์ธ์ดํด(์ํ)์ด ์๋ ๋ฐฉํฅ ๊ทธ๋ํ์ด๋ค.
- ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์์ ๋ค์ ํํํ ์ ์๋ค. (์ : ๋ํ ๊ณผ์ ์ ์ ์๊ณผ๋ชฉ)
DAG ์์
DAG์์ ๋ ธ๋ A์์ ๋ ธ๋ B๋ก์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ ๋,
- A๋ B์ ์ ํ์(predecessor)์ด๋ค.
- B๋ A์ ํํ์(successor)์ด๋ค.
DAG์์ ๋ ธ๋ A์์ ๋ ธ๋ B๋ก์ ์ฃ์ง e๊ฐ ์กด์ฌํ ๋,
- A๋ B์ ์ฆ๊ฐ ์ ํ์(immediate predecessor)์ด๋ค.
- B๋ A์ ์ฆ๊ฐ ํํ์(immediate successor)์ด๋ค.
- DAG์์ ๊ทธ๋ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ ธ๋๋ค์ ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค. ์ฆ, ์ฐ์ ์์์ ๋ฐ๋ผ ๋ฐฐ์นํ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์์์ ๋ ฌ์ ๊ฒฐ๊ณผ๋ ์ ์ผํ์ง ์๋ค.
๋ฐฉํฅ ๊ทธ๋ํ์์ ์ด๋ค ๋ ธ๋์ ๋ค์ด์ค๋ ์ฃ์ง์ ์๋ฅผ in-degree, ๋๊ฐ๋ ์ฃ์ง์ ์๋ฅผ out-degree๋ผ๊ณ ํ๋ค๊ณ ํ๋ค. (๊ทธ๋ํ ์ฉ์ด ์ ๋ฆฌ ์ฐธ๊ณ )
์ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด, ๊ฐ ๋ ธ๋๋ณ๋ก ์ง์ ์ฐจ์, ์ฆ in-degree ๋ฅผ ๋์ดํ๊ณ ์๋ค.
- ์ด ๋ in-degree๊ฐ 0์ธ ๋
ธ๋(์์์ ) ๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ค.
์ด ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ๋ง์ ์ธ์ดํด์ด ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ฏ๋ก, DAG๊ฐ ์๋๋ค.
- ์ฐ๋ฆฌ๋ ์ด in-degree ๊ฐ์ ์ด์ฉํด์ ๊ทธ ๊ฐ์ด 0 -> N ์ธ ์์ผ๋ก ํ์ํ ๊ฒ์ด๋ค.
์๋ํ๋ฉด "๊ทธ๋ํ๋ฅผ ์ง์ ์ฐจ์์ ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ"ํ ๊ฒ์ด๋๊น !!
- ํ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์ in-degree ๊ฐ์ด 0์ธ ๋ ธ๋๋ค์ ์ ๊ฑฐํด๋๊ฐ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ง ์์ ๋ ธ๋๋ค์ ์ ์ 0์ผ๋ก ์์ ํ ๋ค ์ ๊ฑฐํด๊ฐ๋ฉฐ ์ ๋ ฌ์ ํด๋๊ฐ ๊ฒ์ด๋ค.
์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๊ทธ๋ฆผ์ ๋ ์์ธํ ์ดํด๋ณด๋ฉด ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด๋ด๊ณ ์์์ ์ ์ ์๋ค.
- in-degree๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. 1์ด๋ค.
- ๋ ธ๋ 1์ ์ ๊ฑฐํ๊ณ , ๋ ธ๋ 1์ ์ฆ๊ฐ ํํ์(immediate successor)๋ค์ธ ๋ ธ๋ 2, 3, 4์ in-degree๋ฅผ 1์ฉ ๊ฐ์ํ๋ค.
- in-degree๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. 3์ด๋ค.
- ๋ ธ๋ 3์ ์ ๊ฑฐํ๊ณ , ๋ ธ๋ 3์ ์ฆ๊ฐ ํํ์์ธ ๋ ธ๋ 4์ in-degree๋ฅผ 1 ๊ฐ์ํ๋ค.
- in-degree๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. 4์ด๋ค.
- ๋ ธ๋ 4๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ ธ๋ 4์ ์ฆ๊ฐ ํํ์๋ค์ธ ๋ ธ๋ 2, 5์ in-degree๋ฅผ 1 ๊ฐ์ํ๋ค.
- in-degree๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. 2์ด๋ค.
- ๋ ธ๋ 2๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ ธ๋ 2์ ์ฆ๊ฐ ํํ์์ธ ๋ ธ๋ 5์ in-degree๋ฅผ 1 ๊ฐ์ํ๋ค.
- in-degree๊ฐ 0์ธ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. 5์ด๋ค.
- ๋ ธ๋ 5๋ฅผ ์ ๊ฑฐํ๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ์ ๊ฑฐ๋์๋ค.
- ์ ๊ฑฐํ ๋ ธ๋๋ค์ ์ฐจ๋ก๋ก ๋ณด๋ฉด, ๋ ธ๋ 1 > 3 > 4 > 2 > 5 ์ด๋ค.
์ด๋ ๊ฒ ์์์ ๋ ฌ [1, 3, 4, 2, 5] ๋ฅผ ๋์ถํ์๋ค. ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ๋ค์์ ๋ก์ง์ ๋ฐ๊ฒฌํ ์ ์๋ค.
๋ฐ๋ณต (๋
ธ๋๊ฐ ๋ชจ๋ ์ ๊ฑฐ๋ ๋๊น์ง) {
1. in-degree๊ฐ 0์ธ ๋
ธ๋๋ฅผ ์ฐพ๋๋ค.
2. ๊ทธ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ๋ค.
3. ๊ทธ ๋
ธ๋์ ์ฆ๊ฐ ํํ์๋ค์ in-degree๋ฅผ 1์ฉ ๊ฐ์ํ๋ค.
}
๊ทธ๋ผ ์ด์ ์ด ๋ก์ง์ ์ด๋ป๊ฒ ์ฝ๋๋ก ๊ตฌํํ ์ ์์์ง ์๊ฐํด๋ณด์.
์ฐ์ ๊ทธ๋ํ์ ์ ๋ณด๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ทธ๋ํ ๋ ธ๋์ ์ ๋ณด
- ๊ฐ ๋ ธ๋ ๋ณ in-degree ๊ฐ
- ๊ฐ ๋ ธ๋์ ๋ฐฉํฅ ์ฃ์ง๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ธ๋๋ค
์์ ์ ๋ณด๊ฐ ํ์ํ ๊ทธ๋ํ๋ฅผ ๊ตฌํํ๊ธฐ์ ์ ํฉํ ๊ทธ๋ํ ํํ ๋ฐฉ์์ ์ธ์ ๋ฆฌ์คํธ ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
๊ทธ๋ํ์ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค๊ณ ํด๋ณด์.
- N : ๋ ธ๋์ ๊ฐ์ (๋ ธ๋๋ 1 ~ N)
- M : ์ฃ์ง์ ๊ฐ์
- M๊ฐ์ ๊ด๊ณ๋ค : ๋ ธ๋ A -> ๋ ธ๋ B
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๋ํ, in-degree ๊ฐ ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ผ ๊ฒ์ด๋ค.
- ๊ทธ๋ํ ๋ง๋ค๊ธฐ : ์ธ์ ๋ฆฌ์คํธ ํ์์ผ๋ก ๊ฐ ๋ ธ๋ ๋ณ LinkedList๋ฅผ ์์ฑํ๋ค.
- in-degree ๋ฐฐ์ด : ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ ธ๋ ๊ฐ์ผ๋ก ๋๊ณ , ๋ ธ๋ ๋ผ๋ฆฌ์ ๊ด๊ณ ๊ฐ์ ๋ฐ์ ๋๋ง๋ค ๊ทธ ๋ ธ๋์ ๋ค์ด์จ ๊ฐ์ ์ฌ๋ ค์ค๋ค.
์๋์ ์์ ์ฝ๋์์ ํธ์๋ฅผ ์ํด ์ธ๋ฑ์ค 0์ ๋น์๋์๋ค.
public class Main {
static int N, M;
static LinkedList<Integer>[] graph;
static int[] indegree;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new LinkedList[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new LinkedList<>();
}
indegree = new int[N + 1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
graph[from].add(to);
indegree[to] ++;
}
System.out.println(Arrays.toString(graph));
System.out.println(Arrays.toString(indegree));
br.close();
}
}
๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์์ผ๋ก ๊ฐ์ด ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์, ๊ทธ๋ํ๊ฐ ์์ฑ๋์์ผ๋ฏ๋ก ์ด์ ์์์ ์ ์ํ ๋ก์ง์ ๊ตฌํํ ์ฐจ๋ก์ด๋ค. ๋ค์ ํ ๋ฒ ์ดํด๋ณด์.
๋ฐ๋ณต (๋
ธ๋๊ฐ ๋ชจ๋ ์ ๊ฑฐ๋ ๋๊น์ง) {
1. in-degree๊ฐ 0์ธ ๋
ธ๋๋ฅผ ์ฐพ๋๋ค. (์ด ๋
ธ๋๋ ์ฌ๋ฌ ๊ฐ์ผ ์ ์๋ค.)
2. ๊ทธ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ๋ค.
3. ๊ทธ ๋
ธ๋์ ์ฆ๊ฐ ํํ์๋ค์ in-degree๋ฅผ 1์ฉ ๊ฐ์ํ๋ค.
}
์ ๋ก์ง์ ์ฝ๋๋ก ๊ตฌํํ๊ธฐ ์ํด ๋ค์ ์๊ฐํด๋ณด์์ ๋, ์ฐ์ in-degree๊ฐ 0์ธ ๋ ธ๋๋ค์ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ ๊ณต๊ฐ์ zeros ๋ผ๊ณ ์นญํด๋ณด๊ฒ ๋ค. ์ด ๋ zeros๋ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์๊น?
์ฐ๋ฆฌ๋ ๋จผ์ in-degree๊ฐ 0์ธ ๋ ธ๋๋ค์ ์๋ฅด๋ฅด ๊ฒ์ฌ ํ๊ณ -> zeros์ ์ฐจ๊ณก์ฐจ๊ณก ์์ ๋ค์ -> ๋งจ ์์ ๋ ธ๋๋ถํฐ ๊บผ๋ด์์ -> ๊ฐ ๋ ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋ค์ ๋ ธ๋๋ค์ ์ฐพ๊ณ -> ๊ทธ ๋ ธ๋๋ค์ in-degree ๊ฐ์ -1์ฉ ์ ๋ฐ์ดํธ ํ๊ณ -> ๊ฐ์ด 0์ด ๋์์ ๋๋ ๋ ๊ทธ ์์ด๋ค์ zeros์ ๋ฃ๊ณ ....
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ ๊ฒ์ด๋ค. ์ฆ zeros๋ ๋ ธ๋ ์ ์ฅ ํ ์ฒ์์ ๋ค์ด๊ฐ๋ ๊ฒ๋ถํฐ ์ ๊ฑฐํ๊ธฐ ์ํด ํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค.
Queue<Integer> zeros = new LinkedList<>();
for (int i = 1; i <= N; i++) {
if (indegree[i] == 0) zeros.offer(i);
}
while (!zeros.isEmpty()) {
int target = zeros.poll();
System.out.print(target + " ");
for (int node : graph[target]) {
indegree[node] --;
if (indegree[node] == 0) {
zeros.offer(node);
}
}
}
System.out.println("");