DFS์™€ BFS

์‚ฌ์ „ ์ง€์‹

ํƒ์ƒ‰

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •

์Šคํƒ๊ณผ ํ

๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ

์žฌ๊ท€ ํ•จ์ˆ˜

์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜. ์ˆ˜ํ•™์˜ ์ ํ™”์‹์„ ์ฝ”๋“œํ™”ํ•œ ๊ฒƒ

  • ์ ํ™”์‹: ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ž๊ธฐ๋ณด๋‹ค ๋” ์ž‘์€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๊ด€๊ณ„๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ

  • ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์ ์  ์ž‘์•„์ง€๋Š” ์ž๊ธฐ ์ž์‹  + ์ข…๋ฃŒ ์กฐ๊ฑด์„ ํ†ตํ•ด ๋™์ž‘ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„

  • vertex(์ •์ )๊ณผ edge(๊ฐ„์„ )์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ

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

์ธ์ ‘ ํ–‰๋ ฌ

2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ

INF = 987654321
graph = [
	[0, 7, 5],
	[7, 0, INF],
	[5, INF, 0]
]

# 0๊ณผ 1์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„
graph[0][1] ( == graph[1][0])

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

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ํ‘œํ˜„

vertex = 3
graph = [[] for i in range(vertex)]

# 0๋ฒˆ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ ์ •๋ณด
graph[0].append((1, 7))
graph[0].append((2, 5))

# 1๋ฒˆ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ ์ •๋ณด
graph[1].append((0, 7))

# 2๋ฒˆ ๋…ธ๋“œ์™€์˜ ์—ฐ๊ฒฐ ์ •๋ณด
graph[2].append((0, 5))

# 0๋ฒˆ๊ณผ 1๋ฒˆ์˜ ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ํƒ์ƒ‰
graph[0].find

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

  • ์ธ์ ‘ ํ–‰๋ ฌ

    • ์žฅ์ : ๋‘ ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ์ด ์‰ฝ๊ณ  ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋น ๋ฆ„

    • ๋‹จ์ : ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„

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

    • ์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ (์ž๊ธฐ ์ž์‹ ๊ณผ์˜ ๊ด€๊ณ„ ์ €์žฅ X, ํ•„์š”ํ•œ ๋…ธ๋“œ์˜ ๊ด€๊ณ„๋งŒ ์ €์žฅ)

    • ๋‹จ์ : ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ์„ ์œ„ํ•ด ์ˆœํšŒ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. (์ •๋ณด ์–ป๋Š” ์†๋„ ๋А๋ฆผ)

  • ๋”ฐ๋ผ์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์— ๋น„ํ•ด ๊ฐ„์„ ์ด ํ™•์—ฐํžˆ ์ ์„ ๋•Œ(sparse graph)์—๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


์ •์˜

๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹

์ธ์ ‘ ๋…ธ๋“œ๊ฐ„์—๋Š” ์ •ํ•ด์ง„ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์ง€๋Š” ์•Š์œผ๋‚˜ ๋ณดํ†ต ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰

๊ตฌํ˜„

์Šคํƒ๊ณผ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ, ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ ๋ฏธ๋ฐฉ๋ฌธ์ธ ๋…ธ๋“œ๊ฐ€ ์—†์„ ์‹œ ๊บผ๋‚ธ๋‹ค.

๋‚˜๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ธ์ ‘ ํ–‰๋ ฌ์„, ์—†๋Š” ๊ฒฝ์šฐ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค.

์ธ์ ‘ ํ–‰๋ ฌ

INF = 987654321

def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=" ")
    for i in range(len(graph[0])):
        if graph[v][i] != 0 and graph[v][i] != INF and not visited[i]:
            dfs(graph, i, visited)

graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]
visited = [False] * len(graph[0])
start = 1

dfs(graph, start, visited)

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

def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=" ")
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

vertex = 4
graph = [
    [2, 3],
    [2],
    [0, 1],
    [0]
]
start = 1
visited = [False] * vertex

dfs(graph, start, visited)

์‹œ๊ฐ„ ๋ณต์žก๋„

dfs ํ•จ์ˆ˜(๊ณง ๋ฐ˜๋ณต๋ฌธ)๋Š” ์ •์ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ˜ธ์ถœ๋˜๊ณ , ๋ฐ˜๋ณต๋ฌธ์€ graph[v] == ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ˆœํšŒํ•˜๋ฏ€๋กœ ์ธ์ ‘ ํ–‰๋ ฌ์˜ ๊ฒฝ์šฐ O(V + E), ์ธ์ ‘ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ O(V^2)์ด๋‹ค.


์ •์˜

์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•œ ๋’ค ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ ์ธ์ ‘ ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹

๊ตฌํ˜„

ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฏธ๋ฐฉ๋ฌธ๋œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ธ์ ‘ ํ–‰๋ ฌ์„, ์—†๋Š” ๊ฒฝ์šฐ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค.

์ธ์ ‘ ํ–‰๋ ฌ

from collections import deque

INF = 987654321

def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True
    while queue:
        v = queue.popleft()
        print(v, end=" ")
        for i in range(len(graph[0])):
            if graph[v][i] != 0 and graph[v][i] != INF and not visited[i]:
                queue.append(i)
                visited[i] = True

graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]
start = 1
visited = [False] * len(graph[0])

bfs(graph, start, visited)

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

from collections import deque

def bfs(graph, start, visited):
    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

vertex = 4
graph = [
    [2, 3],
    [2],
    [0, 1],
    [0]
]
start = 1
visited = [False] * vertex

bfs(graph, start, visited)

์‹œ๊ฐ„ ๋ณต์žก๋„

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ˜๋ณต๋ฌธ์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ, ์ˆœํšŒ ํšŸ์ˆ˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜๋งŒํผ์ด๋ฏ€๋กœ O(V+E)๋˜๋Š” O(V^2์ด์ง€๋งŒ DFS๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค.

Last updated