๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 11724๋ฒ ์ฐ๊ฒฐ ์์์ ๊ฐ์ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
ํด๊ฒฐ๋ฒ
์ฐ๊ฒฐ ์์(Connected Component) ๋ฌธ์ ๋ ๋ํ์ ์ธ DFS์ BFS ๋ฌธ์ ๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฌธ์ ๊ฐ ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๋ฐ๋ก ์ด๊ฒ์ด๋ค.
๋ง์ฝ 7๊ฐ์ ๊ทธ๋ํ ๋ ธ๋๊ฐ ์กด์ฌํ๊ณ , ๊ฐ๊ฐ์ ๋ ธ๋๊ฐ ์๋์ ๊ฐ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด, ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ ์ด 3๊ฐ๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
์ ๊ทผ๋ฒ
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์์์ ์ฐพ์ ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค.
์ด๋ป๊ฒ ํ ๊น?
๊ทธ๋ํ ๊ฐ ๋
ธ๋์์ DFS๋ฅผ ์ํํ๊ณ ์ฒ์ ์ํํ ๋๋ง ์๋ฅผ Count ํด์ฃผ๊ณ (๋ฐฉ๋ฌธ ์ด๋ ฅ์ด ์๋ ๋
ธ๋์ผ ๋๋ง) ํ์ ๋๋ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๋
ธ๋ 1๋ฒ ๋ถํฐ ๋ง์ง๋ง ๋
ธ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณต ํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์๋๋ฉด 1๋ฒ ๋ ธ๋๊ฐ 2, 3, 5๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด์๋ค๋ฉด 1๋ฒ ๋ ธ๋๋ง DFS๋ฅผ ์งํํ๋ค๋ฉด ์ฐ๊ฒฐ๋ ๋ชจ๋ ์์๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๊ฐ ๋์ด 2๋ฒ๊ณผ 3๋ฒ, 5๋ฒ ๊ฐ๊ฐ DFS๋ฅผ ์ํํ๋ ค ํด๋ ์ฐ๊ฒฐ๋์ด์๋ ์์๋ก ๋ณด๊ณ DFS๊ฐ ๋์ง ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ๋ชจ๋ ์์์ ๋ํด์ DFS๋ฅผ ์งํํ๋ฉด ์ฐ๊ฒฐ ์์๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ฌผ๋ก ์ด ๋ฌธ์ ๋ DFS๋ BFS ๋ ๋ฐฉ๋ฒ ๋ชจ๋๋ก ํด๊ฒฐํ ์ ์๋ค. ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํด๋ณด์.
์ ๋ต ์ฝ๋
public class Main {
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] nm = br.readLine().split(" ");
int n = Integer.parseInt(nm[0]);
int m = Integer.parseInt(nm[1]);
visited = new boolean[n + 1];
for(int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
while(m-- > 0) {
String[] uv = br.readLine().split(" ");
int u = Integer.parseInt(uv[0]);
int v = Integer.parseInt(uv[1]);
graph.get(u).add(v);
graph.get(v).add(u);
}
int answer = 0;
for (int i = 1; i <= n; i++) {
if(dfsByRecursive(i)) {
answer += 1;
}
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
private static boolean dfsByRecursive(int x) {
if(visited[x]) {
return false;
}else {
visited[x] = true;
int size = graph.get(x).size();
for (int i = 0; i < size; i++) {
int value = graph.get(x).get(i);
if(!visited[value]){
dfsByRecursive(value);
}
}
return true;
}
}
private static boolean bfs(int x) {
Queue<Integer> queue = new LinkedList<>();
if(visited[x]) {
return false;
}else {
queue.add(x);
visited[x] = true;
while(!queue.isEmpty()) {
x = queue.remove();
int size = graph.get(x).size();
for(int i = 0; i < size; i++) {
int value = graph.get(x).get(i);
if(!visited[value]) {
queue.add(value);
visited[value] = true;
}
}
}
return true;
}
}
}
๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์ ํต๊ณผํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๊ธ