Jayden1116 2022. 4. 13. 20:48

ํ‚ค์›Œ๋“œ

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
  • BFS(Breadth First Search; ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)
  • DFS(Depth First Search; ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)
  • ์Šคํƒ, ํ, ์žฌ๊ท€ ํ™œ์šฉ

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

  • ์ˆœํšŒ : ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)์™€ DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์ด ์žˆ๋‹ค.

[์•Œ๊ณ ๋ฆฌ์ฆ˜ : ํƒ์ƒ‰] BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

image

  • ํ˜„์žฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋“ค๋ถ€ํ„ฐ ํƒ์ƒ‰
  • ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ(queue)๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„
  • ์žฅ์  : ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ์— ์œ ๋ฆฌํ•˜๋‹ค.
  • ๋‹จ์  : ์žฌ๊ท€๋กœ๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ DFS์™€ ๋‹ฌ๋ฆฌ ํ๋ฅผ ์ด์šฉํ•ด ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๋“ค์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค.

ํ๋ฅผ ์ด์šฉํ•œ BFS ๊ตฌํ˜„


## ๊ทธ๋ž˜ํ”„(bfs_graph)๊ฐ€ ๋”ฐ๋กœ ์ฃผ์–ด์ ธ์•ผํ•จ

def bfs_queue(start_node, bfs_graph):
    bfs_list = [start_node]
    que = [start_node]

    while que:
        node = que.pop(0)
        for i in bfs_graph[node]:
            if i not in bfs_list:
                bfs_list.append(i)
                que.append(i)
    return bfs_list

[์•Œ๊ณ ๋ฆฌ์ฆ˜ : ํƒ์ƒ‰] DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

image

  • ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ ๋“ค๊นŒ์ง€ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด์„œ ํƒ์ƒ‰
  • ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ์Šคํƒ(stack)์„ ํ†ตํ•ด ๊ตฌํ˜„ ๋˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„
  • ์žฅ์  : BFS์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ(์ €์žฅ๊ณต๊ฐ„)์˜ ํ•„์š”์„ฑ์ด ์ ๋‹ค. ์ฐพ์•„์•ผํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ๊นŠ์€ ๋‹จ๊ณ„์— ์žˆ์„์ˆ˜๋ก ์œ ๋ฆฌํ•˜๋‹ค.
  • ๋‹จ์  : ์ฐพ์€ ๋‹ต์ด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ผ๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.

์Šคํƒ์„ ์ด์šฉํ•œ DFS ๊ตฌํ˜„


## ๊ทธ๋ž˜ํ”„(dfs_graph)๊ฐ€ ๋”ฐ๋กœ ์ฃผ์–ด์ ธ์•ผํ•จ

def dfs_stack(start_node):
    dfs_list = []
    stack = [start_node]

    while stack:
        node = stack.pop()
        if node not in dfs_list:
            dfs_list.append(node)
            stack.extend(dfs_graph[node])
    return dfs_list

 

์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ DFS ๊ตฌํ˜„


## ๊ทธ๋ž˜ํ”„(dfs_graph)๊ฐ€ ๋”ฐ๋กœ ์ฃผ์–ด์ ธ์•ผํ•จ

def dfs_recur(node, dfs_list=[]):
    dfs_list.append(node) 

    for i in dfs_graph[node]: 
        if i not in dfs_list:
            dfs_recur(i)
    return dfs_list