Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Basic

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS, BFS

๊ฐ์ž ๐Ÿฅ” 2021. 7. 23. 19:26
๋ฐ˜์‘ํ˜•

-- ๋ณธ ํฌ์ŠคํŒ…์€ ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ ์ฑ…์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

1. DFS

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

๊ทธ๋ž˜ํ”„ ์˜ˆ์‹œ

  • ๋งˆ์ง€๋ง‰์— "์Šคํƒ์ด ๋“ค์–ด๊ฐ„ ์ˆœ์„œ" ๋ฅผ ํ•œ๋ฐ ๋ชจ์•„๋ณด๋ฉด, 1,2,7,6,8,3,4,5 ๊ฐ€ ๋œ๋‹ค.

 

โ–ถ  DFS๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

  • ์œ„์™€ ๋™์ผํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  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์ฐจ์› ๋ฆฌ์ŠคํŠธ)
# ์ผ๋‹จ 9๊ฐœ๋ฅผ Fasle๋กœ ํ‘œํ˜„ํ•˜๊ณ , ๋ฐฉ๋ฌธํ• ๋–„๋งˆ๋‹ค True๋กœ ๋ฐ”๊พธ์–ด ์ค„ ๊ฒƒ์ž„.
# ๋…ธ๋“œ ๋ฒˆํ˜ธ์™€ ํ†ต์ผ์‹œํ‚ค๊ธฐ ์œ„ํ•ด graph ์—๋„ grpah[0]์— ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๊ณ , ์—ฌ๊ธฐ์„œ๋„ 9๊ฐœ๋กœ.
visited = [False] * 9

# ์ •์˜๋œ DFSํ•จ์ˆ˜ ํ˜ธ์ถœ
DFS(graph, 1, visited)
## ์ถœ๋ ฅ๊ฐ’ ---> 1 2 7 6 8 3 4 5

 

2. BFS

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

๊ทธ๋ž˜ํ”„ ์˜ˆ์‹œ

  • ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ๋Š” 1, 2, 3, 8, 7, 4, 5, 6 ์ด ๋œ๋‹ค.

 

โ–ถ BFS๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

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

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

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„
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

 

๋ฐ˜์‘ํ˜•