[Silver II/JAVA] 24479, 24480 ์๊ณ ๋ฆฌ์ฆ ์์ - ๊น์ด ์ฐ์ ํ์ 1, 2
https://www.acmicpc.net/problem/24479

- ๋ฌธ์ ์ ์กฐ๊ฑด
์ ์ ์ ์ : N
๊ฐ์ ์ ์ : M
์์ ์ ์ : R
์ธ์ ์ ์ ์ ์ค๋ฆ์ฐจ์ ๋ฐฉ๋ฌธ (24479๋ฒ ๋ฌธ์ )
์ธ์ ์ ์ ์ ๋ด๋ฆผ์ฐจ์ ๋ฐฉ๋ฌธ (24480๋ฒ ๋ฌธ์ )
- ํ์ํ ๊ฒ
ArrayList (์ด์ฐจ์ Array๋ N*N์ด๋ผ ์๊ฐ์ด๊ณผ ๋ฐ์ํจ)
-> ์ค์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ง ์ ์ฅํ๋ ArrayList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์
- ์ด์ฐจ์ ๋ฐฐ์ด์ ์๊ฐ ๋ณต์ก๋ : O(N)
- ์ธ์ ๋ฆฌ์คํธ์ ์๊ฐ ๋ณต์ก๋ : O(E), ์ฌ๊ธฐ์ E๋ ๊ฐ์ ์ ๊ฐ์. ์ธ์ ๋ฆฌ์คํธ๋ ๊ฐ์ ์ ๊ฐ์์ ์๊ฐ๋ณต์ก๋๊ฐ ๋น๋กํ๋ค.
- ์ ๋ ฅ๋ฐ๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]); // ์ ์ ์ ์
int M = Integer.parseInt(str[1]); // ๊ฐ์ ์ ์
int R = Integer.parseInt(str[2]); // ์์ ์ ์
- Scanner๋ณด๋ค BufferedReader๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ฑ๋ฅ์ด ์ข๋ค.
- BufferedReader๋ ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํ๋ณํ์ด ํ์ํ๋ค.
- ์ ๋ ฅ์ ๊ณต๋ฐฑ๋จ์๋ก ๋์ด์ ์คํธ๋ง ๋ฐฐ์ด์ ๋ด์์ ์ฝ๋๋ค.
- visited ๋ฐฐ์ด, graph ๋ฐฐ์ด ์ด๊ธฐํํ๊ธฐ
// ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด ์ด๊ธฐํ
visited = new int[N + 1];
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < N + 1; i++) {
graph.add(new ArrayList<>());
}
- ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด '์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N ๋ฒ...' ์ด๋ผ๊ณ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ 1๋ถํฐ ์ฌ์ฉํ๊ธฐ ์ํด N+1 ํฌ๊ธฐ๋ก ์ ์ธํ๋ค.
- visited ๋ฐฐ์ด์ ์ ์ ์ ๋ฐฉ๋ฌธ์ ๊ธฐ๋กํ๋ ์ญํ ์ด๋ค.
- graph ๋ฐฐ์ด์ ์ ์ ๋ฒํธ๋ง๋ค ๋ณ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ๋ค.
- ๊ฐ์ ์ ๋ณด ์ ๋ ฅ๋ฐ๊ธฐ
// ๊ทธ๋ํ์ ๊ฐ์ ์ ๋ณด ์ ์ฅ
for (int i = 0; i < M; i++) {
str = br.readLine().split(" ");
int u = Integer.parseInt(str[0]);
int v = Integer.parseInt(str[1]);
// ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ
graph.get(u).add(v);
graph.get(v).add(u);
}
- ๊ฐ์ ์ ์ M๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ๊ฐ์ ์ ์ ๋ ฅ๋ฐ๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ๋ ฅ์ด 1 4 ์ด๋ฉด ์ ์ 1๊ณผ ์ ์ 4๋ฅผ ์ฐ๊ฒฐํ๋ค๋ ๋ป์ด๋ค. ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ์ด๋ ์ ์ 4์ ์ ์ 1์ ์ฐ๊ฒฐํ๋ค๋ ๋ป๊ณผ๋ ๊ฐ๊ธฐ ๋๋ฌธ์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ํํํ๋ค.
- ์ ์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธ
// ์ธ์ ๋ฆฌ์คํธ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (int i = 1; i < N + 1; i++) {
Collections.sort(graph.get(i));
}
- ์๋ฐ Collections์ sort() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ๊ฐ๋จํ ํ ์ ์๋ค.
- ์ ์ ๋ฒํธ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธ
// ์ธ์ ๋ฆฌ์คํธ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
for (int i = 1; i < N + 1; i++) {
Collections.sort(graph.get(i), Collections.reverseOrder());
}
- reverseOrder() ๋ฉ์๋๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ด๋ค.
- DFS ๊น์ด ์ฐ์ ํ์
// DFS ํ์
private static void dfs(int node) {
visited[node] = count; // ๋ฐฉ๋ฌธ ์์ ๊ธฐ๋ก
for (int i = 0; i < graph.get(node).size(); i++) {
int nextNode = graph.get(node).get(i);
if (visited[nextNode] == 0) { // ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
count++;
dfs(nextNode);
}
}
}
- ์์์ ๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ๋ค๋ฉด DFS ํ์์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ๋ค.
- ์ถ๋ ฅํ๊ณ ์ ํ๋ ๊ฒ์ ๋ฐฉ๋ฌธ์์์ด๋ค.
์ ์ฒด์ฝ๋
import java.io.*;
import java.util.*;
public class Main{
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
static int[] visited;
static int count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]);
int M = Integer.parseInt(str[1]);
int R = Integer.parseInt(str[2]);
//๋ฐฉ๋ฌธ์ฒดํฌํ ๋ฐฐ์ด
visited = new int[N+1];
//graph ์ด๊ธฐํ
for(int i=0; i<N+1; i++){
graph.add(new ArrayList<>());
}
//graph์ ๊ฐ ์ ์ฅ
for(int i=0; i<M; i++){
str = br.readLine().split(" ");
int u = Integer.parseInt(str[0]);
int v = Integer.parseInt(str[1]);
//๋ฌด๋ฐฉํฅ๊ทธ๋ํ
graph.get(u).add(v);
graph.get(v).add(u);
}
//์ค๋ฆ์ฐจ์ ์ ๋ ฌ (24479๋ฒ ๋ฌธ์ )
for(int i=1; i<N+1; i++){
Collections.sort(graph.get(i));
}
//๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ (24480๋ฒ ๋ฌธ์ )
for(int i=1; i<N+1; i++){
Collections.sort(graph.get(i), Collections.reverseOrder());
}
//๋ฐฉ๋ฌธ ์นด์ดํธ
count = 1;
//์์์ ์ ๋ถํฐ ํ์
dfs(R);
//์ถ๋ ฅ
for(int i=1; i<=N; i++){
System.out.println(visited[i]);
}
}
//DFS ํ์
private static void dfs(int node){
visited[node] = count;
for(int i=0; i<graph.get(node).size(); i++){
int nextNode = graph.get(node).get(i);
if(visited[nextNode] == 0){ //๋ฐฉ๋ฌธํ์ ์์ผ๋ฉด
count++;
dfs(nextNode);
}
}
}
}