Skip to content

Commit 2ed7544

Browse files
add: num-of-connected-components
1 parent 1a71772 commit 2ed7544

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import java.util.ArrayList;
2+
import java.util.HashMap;
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
// 문제 해결에 용이하게 주어진 단방향 그래프를 양방향으로 바꾸어 DFS 실행
7+
class Solution {
8+
9+
public int countComponents(int n, int[][] edges) {
10+
List<List<Integer>> graph = new ArrayList<>();
11+
boolean[] visited = new boolean[n];
12+
13+
// 인접 리스트 초기화
14+
for (int i = 0; i < n; i++) {
15+
graph.add(new ArrayList<>());
16+
}
17+
18+
// 양방향 그래프 구성
19+
for (int[] edge : edges) {
20+
graph.get(edge[0]).add(edge[1]);
21+
graph.get(edge[1]).add(edge[0]);
22+
}
23+
24+
int count = 0;
25+
26+
for (int i = 0; i < n; i++) {
27+
if (!visited[i]) {
28+
dfs(i, graph, visited);
29+
count++;
30+
}
31+
}
32+
33+
return count;
34+
}
35+
36+
private void dfs(int node, List<List<Integer>> graph, boolean[] visited) {
37+
visited[node] = true;
38+
for (int neighbor : graph.get(node)) {
39+
if (!visited[neighbor]) {
40+
dfs(neighbor, graph, visited);
41+
}
42+
}
43+
}
44+
}
45+
46+
// NOTE: 문제에서 주어진 무방향 그래프를 탐색하다, 앞 순번 DFS에서 연결 요소로 판단한 정점을 뒤 DFS 에서 다시 방문한 경우의
47+
// 처리가 까다로웠다
48+
class WrongSolution {
49+
50+
Map<Integer, Boolean> visitMap = new HashMap<>();
51+
boolean[] visit;
52+
public int cnt = 0;
53+
54+
public int countComponents(int n, int[][] edges) {
55+
56+
visit = new boolean[n];
57+
58+
for (int i = 0; i < n; i++) {
59+
if (!visit[i]) {
60+
visitMap = new HashMap<>();
61+
cnt++;
62+
dfs(i, edges);
63+
64+
}
65+
}
66+
67+
return cnt;
68+
}
69+
70+
public void dfs(int v, int[][] edges) {
71+
visit[v] = true;
72+
visitMap.put(v, true);
73+
74+
for (int i = 0; i < edges.length; i++) {
75+
if (edges[i][0] == v && !visit[edges[i][1]]) {
76+
dfs(edges[i][1], edges);
77+
} else if (edges[i][0] == v && visit[edges[i][1]]) {
78+
if (!visitMap.containsKey(edges[i][1])) {
79+
cnt--;
80+
}
81+
}
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)