๐Ÿงฉ Algorithm/[BOJ] Silver

[BOJ] 11724. ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ (Python/DFS/Silver 2)

devCloud 2026. 4. 3. 17:20
728x90

[Baekjoon] 11724. ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

Silver 2 | #DFS #BFS #๊ทธ๋ž˜ํ”„์ด๋ก 

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์˜ ํฌ๊ธฐ)์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ํ•„์š”ํ•จ์„ ๋А๊ผˆ๋‹ค."

728x90