[Baekjoon] 11724. ์ฐ๊ฒฐ ์์์ ๊ฐ์
1. ๋ฌธ์ ์์ฝ ๋ฐ ์ ๊ทผ ๋ฐฉ์
๋ฐฉํฅ ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฐ๊ฒฐ ์์(Connected Component)์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์ฆ, ๊ทธ๋ํ๊ฐ ๋ช ๊ฐ์ ๋ ๋ฆฝ๋ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด ์๋์ง ์ฐพ์์ผ ํ๋ค.
- ์ ์ ์ค์ฌ ํ์: ๊ฐ์ ์ด ์๋ ๊ณ ๋ฆฝ๋ ์ ์ ๋ ํ๋์ ์ฐ๊ฒฐ ์์๋ก ์ทจ๊ธํด์ผ ํ๋ฏ๋ก, ๋ชจ๋ ์ ์ (1~N)์ ์ํํ๋ฉฐ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํด์ผ ํ๋ค.
- ์ธ์ ๋ฆฌ์คํธ ํ์ฉ: ํน์ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค๋ง ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํด ์ธ์ ํ๋ ฌ๋ณด๋ค ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ฌด๋ฐฉํฅ์ฑ: ์๋ฐฉํฅ ์ฐ๊ฒฐ์ ์ํด
graph[u].append(v)์graph[v].append(u)๋ฅผ ๋ชจ๋ ์ํํ๋ค.
2. ์ ์ฒด ์ฝ๋ (Python - DFS)
import sys
# 1. ์ฌ๊ท ๊น์ด ์ค์ (๊ธฐ๋ณธ๊ฐ์ด ๋ฎ์ ํ์์ ์)
sys.setrecursionlimit(10**6)
# 2. ์
๋ ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ๊ธฐ
input = sys.stdin.readline
N, M = map(int, input().split())
graph = [[] for _ in range(N + 1)]
visited = [False] * (N + 1)
element = 0 # ์ฐ๊ฒฐ ์์์ ๊ฐ์
# ์ธ์ ๋ฆฌ์คํธ ์์ฑ (๋ฌด๋ฐฉํฅ)
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
def dfs(idx):
visited[idx] = True
for i in graph[idx]:
if not visited[i]:
dfs(i)
# ๋ชจ๋ ์ ์ ์ ํ์ธํ๋ฉฐ ํ์ ์์
for idx in range(1, N + 1):
if not visited[idx]:
element += 1
dfs(idx)
print(element)
3. โ๏ธ ํ๊ณ : ์ํ์ฐฉ์ค์ ์ธ์ด/์๊ณ ๋ฆฌ์ฆ๋ณ ์ฐจ์ด
๐ซ ์๊ฐ ์ด๊ณผ์ ๊ฐ์ ์ค์ฌ ํ์์ ์ค๋ฅ
์ด๊ธฐ ์ฝ๋์์๋ ๊ฐ์ ๋ฆฌ์คํธ(graph)๋ฅผ ์ง์ ์ํํ๋ฉฐ DFS๋ฅผ ์๋ํ๋ค. ํ์ง๋ง ์ด๋ ์๊ฐ ๋ณต์ก๋๊ฐ O(M^2)์ ๋ฌํด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ณ , ๊ฒฐ์ ์ ์ผ๋ก ๊ฐ์ ์ด ์๋ '๊ณ ๋ฆฝ๋ ์ ์ '์ ์นด์ดํธํ์ง ๋ชปํ๋ ๋
ผ๋ฆฌ์ ์ค๋ฅ๊ฐ ์์๋ค. ์ ์ ๊ธฐ์ค์ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํด์ผ ํจ์จ์ฑ๊ณผ ์ ํ์ฑ์ ๋ชจ๋ ์ก์ ์ ์์์ ๋ฐฐ์ ๋ค.
โ ๊ณผ๊ฑฐ ๊ธฐ๋ก๊ณผ์ ๋น๊ต (C++ & Python BFS)
๊ณผ๊ฑฐ์๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ C++(#110)๋ก ํ์์๊ณ , ํ์ด์ฌ์ผ๋ก ํ ๋๋ BFS(deque)๋ฅผ ์ฃผ๋ก ํ์ฉํ์๋ค. ์ด๋ฒ์ DFS๋ก ๋ค์ ํ๋ฉฐ ๋๋ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- • C++ vs Python: C++์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ง์ ์ ์ด์ง๋ง, ํ์ด์ฌ์
sys.setrecursionlimit์ค์ ์ด ํ์์ ์ด๋ผ๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์๋ค. - • BFS(๊ณผ๊ฑฐ): ํ๋ฅผ ์ด์ฉํด ํ ์ธต์ฉ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์ง๊ด์ ์ด์ง๋ง, ํ์ด์ฌ์์๋
deque๋ชจ๋ ์ํฌํธ์ ํ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค. - • DFS(ํ์ฌ): ์ฌ๊ท๋ฅผ ํตํด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋ฉฐ, ์ฐ๊ฒฐ ์์ ํ๋ณ์ฒ๋ผ ๋จ์ํ ๋ชจ๋ ์ฐ๊ฒฐ์ ์ ํ์ด์ผ ํ๋ ๋ฌธ์ ์์ DFS๊ฐ ๋ ์ง๊ด์ ์ผ ์ ์์์ ์ฒด๊ฐํ๋ค.
๐ก ๋ง๋ฌด๋ฆฌ ํฌ์ธํธ
- ํ์ด์ฌ์์ DFS ์ฌ์ฉ ์
sys.setrecursionlimit์ ํ์ ์กฐ๊ฑด์ด๋ค. - ์ธ์ ๋ฆฌ์คํธ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ผ ๋ ์์ชฝ ๋ชจ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
- ๊ฐ์ ์ด ์๋ ์ ์ ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ๋ณธ์ง์์ ๋ค์ ํ๋ฒ ์๊ฒผ๋ค.
4. ๐ก ์ค์ ํจ์จ์ฑ ๊ณ ๋ฏผ: ์ BFS๊ฐ ๋ ์ ๋ฆฌํ ์ ์์๊น?
์ด๋ฒ ๋ฌธ์ ๋ ๊ฒฝ๋ก์ ๊น์ด๊ฐ ๊น์ด์ง ์ ์๋ '์ฐ๊ฒฐ ์์' ํ์์ด๊ธฐ์ DFS๋ฅผ ์ ํํ์ง๋ง, ๊ณผ๊ฑฐ์ BFS(ํ)๋ก ํ์๋ ๋ฐฉ์๊ณผ ๋น๊ตํด ๋ณด๋ ์ค์ ์ฑ๋ฅ ๋ฉด์์ ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ๋ณด์๋ค.
- 1. ์ฌ๊ท ์ค๋ฒํค๋์ ๋ฉ๋ชจ๋ฆฌ (Memory)
DFS๋ ์ฌ๊ท ํธ์ถ์ด ๊น์ด์ง์๋ก ์์คํ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ด์ฌ์์๋setrecursionlimit์ผ๋ก ๊ฐ์ ์ค์ ์ด ํ์ํ๋ฉฐ, ํธ์ถ ์คํ์ด ์์ผ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ด ์ปค์ง ์ ์๋ค. ๋ฐ๋ฉด BFS๋ Heap ์์ญ์ ํ(Queue)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์์ ๋กญ๋ค. - 2. ์๊ฐ ๋ณต์ก๋์ ์์ ์ฑ (Time)
์ด๋ก ์ ๋ ๋ฐฉ์ ๋ชจ๋ $O(N+M)$์ด์ง๋ง, ํ์ด์ฌ์ ์ฌ๊ท ํจ์ ํธ์ถ์ ๋ฐ๋ณต๋ฌธ ๊ธฐ๋ฐ์while๋ฌธ(BFS)๋ณด๋ค ๋๋ฆฐ ๊ฒฝํฅ์ด ์๋ค. ๋ฐ์ดํฐ๊ฐ ํธํฅ๋์ด ๊ทธ๋ํ์ ๊น์ด๊ฐ ๊ทน๋จ์ ์ผ๋ก ๊น์ ๊ฒฝ์ฐ, DFS๋ ์คํ ์ด๊ณผ ์ํ์ด ์์ง๋ง BFS๋ ์์ ์ ์ผ๋ก ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋ค.
โ ์ต์ข ๊ฒฐ๋ก
"๋จ์ํ ์ฐ๊ฒฐ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ผ๋ฉด Python์์๋ BFS๊ฐ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ์กฐ๊ธ ๋ ์์ ํ๊ณ ํจ์จ์ ์ธ ์ ํ์ด ๋ ์ ์๋ค. ํ์ง๋ง ์ฝ๋์ ๊ฐ๊ฒฐํจ๊ณผ ์ง๊ด์ ์ธ ๊ตฌํ์ DFS๊ฐ ์ฐ์ธํ๋ฏ๋ก, ๋ฌธ์ ์ ์ ์ฝ ์กฐ๊ฑด(N, M์ ํฌ๊ธฐ)์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ๋์ฒํ๋ ๋ฅ๋ ฅ์ด ํ์ํจ์ ๋๊ผ๋ค."
'๐งฉ Algorithm > [BOJ] Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ] 2178. ๋ฏธ๋ก ํ์ (Python/BFS/Silver 1) (0) | 2026.04.06 |
|---|---|
| [BOJ] 2667. ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (Python/DFS/Silver 1) (0) | 2026.04.03 |
| [BOJ] 1303. ์ ์ - ์ ํฌ (Python/๊ทธ๋ํํ์/Silver 1) (0) | 2024.11.16 |
| [BOJ] 5212. ์ง๊ตฌ ์จ๋ํ (Python/๊ตฌํ/Silver 2) (0) | 2024.11.07 |
| [BOJ] 5635. ์์ผ (Python/๊ตฌํ/Silver 5) (0) | 2024.11.06 |