[Boj_2252] ์ค ์ธ์ฐ๊ธฐ
๐ ๋ฌธ์ ๋งํฌ
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);
}
}
๐ง๐ป๐ญ : ๋ํ๋ณ์ ๊ฑธ๋ ค ๊ฑฐ์ ํ๋ฌ๋ง์ ํ๋ ํฌ์คํ ์ด๋ค.. ๋ฐ์ฑํ๊ณ ๋ ๋ถ์ง๋ฐํ ์ด์์ผ์ง..! ๋ฝ์ดํ ๐๐ช๐ป