๐Ÿ“š DFS (Depth-First Search), BFS(Bredth-First Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ๊ตฌ์กฐ

  • ๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)์œผ๋กœ ํ‘œํ˜„๋˜์–ด ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ (Vertex)์ด๋ผ๊ณ ๋„ ๋งํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ
    • ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix): 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹
    • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency List): ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix)

INF = 999999999 # ๋ฌดํ•œ์˜ ๋น„์šฉ ์„ ์–ธ

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„
graph =[
[0,7,5],
[7,0,INF],
[5,INF,0]
]

print(graph)
# --> [[0, 7, 5], [7, 0, 999999999], [5, 999999999, 0]]

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency List)

# ํ–‰(Row)์ด 3๊ฐœ์ธ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„
graph = [[] for _ in range(3)]

# ๋…ธ๋“œ 0์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[0].append((1, 7))
graph[0].append((2, 5))

# ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[1].append((0, 7))

# ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[2].append((0, 5))

print(graph)
# --> [[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]

๐Ÿ””๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด

  • ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์€ ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋œ๋‹ค.
  • ๋ฐ˜๋ฉด์— ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ์†์„ฑ ๋•Œ๋ฌธ์— ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์€ ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์— ๋น„ํ•ด ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.
  • DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ(ํ˜น์€ ์žฌ๊ท€ ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

dfs

๐Ÿ””DFS ํŠน์ง•

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ธฐ์ดˆํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค.
  • ์‹ค์ œ๋กœ๋Š” ์Šคํƒ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•จ์— ์žˆ์–ด O(N)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋œ๋‹ค.
  • DFS๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ตฌํ˜„์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ™์–ด์„œ ์ด๋™ํ•œ๋‹ค๊ฑฐ๋‚˜, ์ด๋™ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์ œ์•ฝ์ด ์žˆ์„ ๊ฒฝ์šฐ ํšจ๊ณผ์ ์ด๋‹ค.
    • ํƒ์ƒ‰ ์‹œ๊ฐ„์€ ๋” ๊ฑธ๋ฆฌ๊ธด ํ•˜์ง€๋งŒ, ๊ฐ€์ค‘์น˜์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ง€์†ํ•ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ๊ตฌํ˜„ ์‹œ, ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ์ง๊ด€์ ์ด์—ฌ์„œ BFS ๋น„ํ•ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ํ•œ๋‹ค.

DFS ์˜ˆ์ œ

# DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end=' ')
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9

# ์ •์˜๋œ DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
dfs(graph, 1, visited)
# --> 1 2 7 6 8 3 4 5
# dfs(1,visited)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.  
  • BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

BFS๋Š” ์„ ์ž…์„ ์ถœ ๋ฐฉ์‹์ธ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

bfs

๐Ÿ””BFS ํŠน์ง•

  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ BFS๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ธฐ์ดˆํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค.
  • ์‹ค์ œ๋กœ๋Š” deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•จ์— ์žˆ์–ด O(N)์˜ ์‹œ๊ฐ„์ด ์‡ผ์˜ค๋œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ DFS๋ณด๋‹ค ์ข‹์€ ํŽธ์ด๋‹ค.
  • ๊ฐ„์„  ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™๊ณ  ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

BFS ์˜ˆ์ œ

from collections import deque

# BFS ๋ฉ”์„œ๋“œ ์ •์˜
def bfs(graph, start, visited):
	# ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque([start])
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[start] = True
    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
    	# ํ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„ ์ถœ๋ ฅํ•˜๊ธฐ
        v = queue.popleft()
        print(v, end=' ')
        # ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž…
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
	[],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
	[7],
    [2,6,8],
    [1,7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ (1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False]*9

# ์ •์˜๋œ BFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
bfs(graph, 1, visited)
# --> 1 2 3 8 7 4 5 6
# bfs(1,visited)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.  

DFS, BFS ์ •๋ฆฌ

ย  DFS BFS
๋™์ž‘ ์›๋ฆฌ ์Šคํƒ ํ
๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์žฌ๊ท€ ํ•จ์ˆ˜ ์ด์šฉ ํ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์šฉ
  • DFS์™€ BFS๋ฅผ ์„ค๋ช…ํ•˜๋Š”๋ฐ ์ „ํ˜•์ ์ธ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆผ์„ ์ด์šฉํ–ˆ๋Š”๋ฐ 1์ฐจ์› ๋ฐฐ์—ด์ด๋‚˜ 2์ฐจ์› ๋ฐฐ์—ด ๋˜ํ•œ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ˆ˜์›”ํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ DFS, BFS ๋ฌธ์ œ ์œ ํ˜•์ด ๊ทธ๋Ÿฌํ•˜๋‹ค.

์˜ˆ์‹œ) ๊ฒŒ์ž„๋งต์ด 3X3 ํ˜•ํƒœ 2์ฐจ์› ๋ฐฐ์—ด, ์ƒํ•˜์ขŒ์šฐ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ

๊ทธ๋ž˜ํ”„

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์ค‘ 2์ฐจ์› ๋ฐฐ์—ด ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ ์‹œ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๋‹ค์Œ ํ’€์ด๋ฒ•์„ ๊ณ ๋ฏผํ•˜๋„๋ก ํ•˜์ž.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ