DFS/BFS ์•Œ์•„๋ณด์ž ๐Ÿค”

ํ‘ธ๋ฅธํ•˜๋Š˜ยท2022๋…„ 7์›” 3์ผ
0

DFS/BFS

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

DFS/BFS ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ (์†Œ๋ฆฌ ์—†๋Š” ์•„์šฐ์„ฑ )

DFS

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
  • ๋ฏธ๋กœ ์ฐพ๊ธฐ /๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ถ„ํ•  ๋•Œ ์‚ฌ์šฉ

์ž‘๋™ ์›๋ฆฌ

  • ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=' ')

    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]
visited = [False] * 9

dfs(graph, 1, visited) #  1 2 7 6 8 3 4 5 

์ฝ”๋“œ์„ค๋ช…

  • graph ๋Š” ์–ด๋–ป๊ฒŒ ์ด์–ด์ ธ์žˆ๋Š” ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค.
  • v ๋Š” ์ธ๋ฑ์Šค ์œ„์น˜ / visited ๋ฅผ ํ†ตํ•ด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๊ตฌ๋ถ„
  • ์ผ๋‹จ vistied [False,False,False,False,False,False,False,False,False] ๋„ฃ๋Š”๋‹ค
  • dfs(graph, 1, visited) ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ graph๋ฅผ ์ฐพ๋Š”๋‹ค.

BFS

  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
  • ์ตœ๋‹จ ๊ฒฝ๋กœ ํ•  ๋•Œ ์‚ฌ์šฉ

์ž‘๋™์›๋ฆฌ

  • ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • 2๋ฒˆ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
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
                
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]
visited = [False] * 9

bfs(graph, 1, visited)  # 1 2 3 8 7 4 5 6 

์ฝ”๋“œ ์„ค๋ช…

  • ๋ฐฉ๋ฌธํ•œ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ queue ๋‹ด์•„๋…ผ๋‹ค
  • vistied ๋ฐฐ์—ด ์ธ๋ฑ์Šค์— True๋กœ ๋ฐ”๊ฟ”๋†“๋Š”๋‹ค.
  • queue ์›์†Œ๊ฐ€ empty ํ•  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค
  • queue ์—์„œ popleft()ํ•˜์—ฌ v ์— ์ €์žฅํ•˜๊ณ 
  • v๋ฅผ printํ•œ๋‹ค # 1
  • ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž…

0๊ฐœ์˜ ๋Œ“๊ธ€