Skip to content

Commit 17516dc

Browse files
committed
Solution: Number of Connected Components in an Unidirected Graph
1 parent 3d9c7d8 commit 17516dc

File tree

1 file changed

+53
-0
lines changed
  • number-of-connected-components-in-an-undirected-graph

1 file changed

+53
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
ํ’€์ด
3+
- DFS์™€ hashmap(set)์„ ์ด์šฉํ•˜์—ฌ ํ’€์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
4+
- ์ด์ „์— ํ’€์ดํ–ˆ๋˜ course schedule ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค
5+
Big O
6+
- N: ๋…ธ๋“œ ๊ฐœ์ˆ˜
7+
- E: ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
8+
- Time complexity: O(N)
9+
- ์ „์ฒด ๋…ธ๋“œ๋ฅผ ์ตœ๋Œ€ 1๋ฒˆ์”ฉ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค
10+
- Space complexity: O(N + E)
11+
- adjacency list์˜ ํฌ๊ธฐ๋Š” E์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
12+
- ๋‘ set์˜ ํฌ๊ธฐ๋Š” N์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
13+
- check ํ•จ์ˆ˜์˜ ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด ๋˜ํ•œ ์ตœ์•…์˜ ๊ฒฝ์šฐ, N์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
14+
*/
15+
16+
func countComponents(n int, edges [][]int) int {
17+
adj := make(map[int][]int)
18+
for _, edge := range edges {
19+
adj[edge[0]] = append(adj[edge[0]], edge[1])
20+
adj[edge[1]] = append(adj[edge[1]], edge[0])
21+
}
22+
// Go๋Š” {int: bool} hashmap์„ set์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•จ
23+
checking := make(map[int]bool) // ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ DFS ํƒ์ƒ‰์—์„œ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•จ
24+
checked := make(map[int]bool) // ๋ชจ๋“  ํƒ์ƒ‰์ด ๋๋‚œ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•จ
25+
// ๊ฐ node๋ฅผ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜
26+
var check func(int)
27+
check = func(i int) {
28+
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š” node๋ผ๋ฉด ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Œ
29+
if _, ok := checked[i]; ok {
30+
return
31+
}
32+
checking[i] = true
33+
for _, nxt := range adj[i] {
34+
if _, ok := checking[nxt]; ok {
35+
continue
36+
}
37+
check(nxt)
38+
}
39+
delete(checking, i)
40+
checked[i] = true
41+
}
42+
43+
res := 0
44+
for i := 0; i < n; i++ {
45+
if _, ok := checked[i]; ok {
46+
continue
47+
}
48+
res++
49+
check(i)
50+
}
51+
52+
return res
53+
}

0 commit comments

Comments
ย (0)