Algorithm/๐Ÿ“š Concept

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•œ DFS์™€ BFS - ํŒŒ์ด์ฌ(Python)

J1Yun 2021. 7. 12. 17:03
728x90

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

  ๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ (Vertex)๋ผ๊ณ ๋„ ํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋Š” '์ธ์ ‘ ํ–‰๋ ฌ'๊ณผ '์ธ์ ‘ ๋ฆฌ์ŠคํŠธ' 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

  • ์ธ์ ‘ ํ–‰๋ ฌ : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹
    - ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์ €์žฅ

์ธ์ ‘ ํ–‰๋ ฌ

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

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

print(graph)

 

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹ 
    - ๋ชจ๋“  ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅ

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

# ํ–‰์ด 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)

 

์ธ์ ‘ ํ–‰๋ ฌ VS ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

  • ์ธ์ ‘ ํ–‰๋ ฌ์€ ๋ชจ๋“  ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ but ๋…ธ๋“œ1๊ณผ ๋…ธ๋“œ2์˜ ์—ฐ๊ฒฐ์„ graph[๋…ธ๋“œ1][๋…ธ๋“œ2]๋กœ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ but ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋Š๋ฆผ
  • ํŠน์ • ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(DFS, BFS)๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ๋” ์œ ๋ฆฌ

 

DFS ( Depth-First Search )

  DFS (Depth-First Search)๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํŠน์ •ํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

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

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค. (pop)
  3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
# DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    visited[v] = True # ํ˜„์žฌ ๋…ธ๋“œ(v) ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    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]
]

# ๊ฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ
visited = [False] * 9

# DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ (์‹œ์ž‘ ๋…ธ๋“œ: 1)
dfs(graph, 1, visited)

 

 

BFS ( Breadth-First Search )

  BFS ( Breadth-First Search )๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

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

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

# BFS ๋ฉ”์„œ๋“œ ์ •์˜
def bfs(graph, start, visited):
    queue = deque([start]) # ํ ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    visited[start] = True # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    
    # ํ๊ฐ€ empty๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    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]
]

# ๊ฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ
visited = [False] * 9

# DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ (์‹œ์ž‘ ๋…ธ๋“œ: 1)
bfs(graph, 1, visited)

 

DFS / BFS ๋ฌธ์ œ ์œ ํ˜•

  • ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
    • DFS/BFS ๋‘ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋Š ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ํ•œ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์ ์„ ๋‹ค ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด DFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
  • ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆซ์ž๊ฐ€ ์ ํ˜€์žˆ๋Š” 1์—์„œ 10๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ๋•Œ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์ง€๋‚˜์˜ค๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฌธ์ œ์™€ ๊ฐ™์ด ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด์•ผํ•  ๊ฒฝ์šฐ์—๋Š” DFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ
    • a์ •์ ๋ถ€ํ„ฐ b์ •์ ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” BFS๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค. DFS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ฒ˜์Œ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ๋กœ๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์ด ์—†์ง€๋งŒ BFS๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ฐพ์•„๋‚ธ ๊ฒฝ๋กœ๊ฐ€ ๊ณง ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
728x90