๐Ÿ” BFS vs DFS

JEONGYUJINยท2025๋…„ 7์›” 3์ผ
post-thumbnail

GNN๊ณต๋ถ€ํ•˜๋Ÿฌ์™”๋‹ค๊ฐ€ ๋ด‰๋ณ€ ๋งž๊ธฐ
-> ๋งจ๋‚  ํ‘ธ๋Š” BFS, DFS ๋˜ ํ‹€๋ฆฌ๋‹ค~

์ง„์งœ BFS, DFS ๋ฌธ์ œ๋Š” ์ข€๋งŒ ๋ณต์žกํ•ด์ ธ๋„ ๋ฌดํ•œ ํ‹€๋ฆผ์ž„~

์ €๋Š” ์ฝ”ํ…Œ ๊ฐ€๊ธฐ์ „์—๋Š” ๊ผญ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ์™ธ์›Œ์„œ ์ ์šฉํ•˜์ž! ๋ผ๋Š” ๋งˆ์ธ๋“œ๋กœ ๊ฐ€์š”

ํ•ญ๋ชฉBFS (Breadth-First Search)DFS (Depth-First Search)
ํƒ์ƒ‰ ๋ฐฉ์‹๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰๊นŠ์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰ ํ›„ ๋˜๋Œ์•„์˜ด
์ž๋ฃŒ๊ตฌ์กฐํ (Queue)์Šคํƒ(Stack) or ์žฌ๊ท€(Recursion)
์‚ฌ์šฉ ์˜ˆ์‹œ์ตœ๋‹จ ๊ฑฐ๋ฆฌ, ํผ์ง ํ˜„์ƒ ๋“ฑ์˜์—ญ ํƒ์ƒ‰, ์กฐํ•ฉ ํƒ์ƒ‰, ๊ฒฝ๋กœ ์กด์žฌ ์—ฌ๋ถ€
๊ตฌํ˜„ ๋‚œ์ด๋„๋น„๊ต์  ์‰ฌ์›€์žฌ๊ท€ ํ˜ธ์ถœ์— ์ต์ˆ™ํ•ด์•ผ ํ•จ
๋Œ€ํ‘œ ์˜ˆ์ œ๋ฏธ๋กœ์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ์–ผ์Œ ๋ฉ์–ด๋ฆฌ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

โœ… BFS ๋ฌธ์ œ: ๋ฏธ๋กœ ํƒˆ์ถœ

๋ฌธ์ œ ์„ค๋ช…

N x M ํฌ๊ธฐ์˜ ๋ฏธ๋กœ๊ฐ€ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1์€ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ธธ, 0์€ ๋ฒฝ์ž…๋‹ˆ๋‹ค.
  • (0, 0)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (N-1, M-1)๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•  ๋•Œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์นธ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.
  • ์ƒํ•˜์ขŒ์šฐ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ

5 6
101010
111111
000001
111111
111111

์˜ˆ์ œ ์ถœ๋ ฅ

10

ํ’€์ด ์ฝ”๋“œ (BFS)

from collections import deque

def bfs_maze_escape(maze):
    n = len(maze)
    m = len(maze[0])
    visited = [[False]*m for _ in range(n)]

    dx = [-1, 1, 0, 0]  # ์ƒํ•˜์ขŒ์šฐ
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append((0, 0))
    visited[0][0] = True

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
                if maze[nx][ny] == 1:
                    queue.append((nx, ny))
                    visited[nx][ny] = True
                    maze[nx][ny] = maze[x][y] + 1  # ์ด์ „ ์นธ ๊ฑฐ๋ฆฌ + 1

    return maze[n-1][m-1]

๐Ÿง  ํ•จ์ˆ˜ ์„ค๋ช…

  • visited: ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ์ฒดํฌ.
  • queue: BFS ํƒ์ƒ‰์„ ์œ„ํ•œ ํ.
  • maze[x][y] = maze[x][y] + 1: ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ˆ„์ .

โœ… DFS ๋ฌธ์ œ: ์–ผ์Œ ์–ผ๋ฆฌ๊ธฐ

๋ฌธ์ œ ์„ค๋ช…

N x M ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€์—์„œ

  • 0: ์–ผ์Œ์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ์นธ
  • 1: ๋ฒฝ

์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ 0 ๋ฌถ์Œ์„ ์–ผ์Œ 1๊ฐœ๋กœ ๋ณธ๋‹ค๋ฉด, ์ „์ฒด ์–ผ์Œ ๋ฉ์–ด๋ฆฌ๋Š” ๋ช‡ ๊ฐœ์ธ๊ฐ€์š”?

์˜ˆ์ œ ์ž…๋ ฅ

4 5
00110
00011
11111
00000

์˜ˆ์ œ ์ถœ๋ ฅ

3

ํ’€์ด ์ฝ”๋“œ (DFS)

def dfs(x, y, graph):
    n = len(graph)
    m = len(graph[0])

    if x < 0 or x >= n or y < 0 or y >= m:
        return False
    if graph[x][y] == 0:
        graph[x][y] = 1  # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        dfs(x-1, y, graph)
        dfs(x+1, y, graph)
        dfs(x, y-1, graph)
        dfs(x, y+1, graph)
        return True
    return False

def count_ice_areas(graph):
    n = len(graph)
    m = len(graph[0])
    count = 0

    for i in range(n):
        for j in range(m):
            if dfs(i, j, graph):
                count += 1
    return count

๐Ÿง  ํ•จ์ˆ˜ ์„ค๋ช…

  • dfs: ํ˜„์žฌ ์œ„์น˜์—์„œ ์ธ์ ‘ํ•œ 0์„ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰.
  • ํ•œ ๋ฒˆ์˜ DFS ํ˜ธ์ถœ = ์–ผ์Œ 1๋ฉ์–ด๋ฆฌ ํƒ์ƒ‰ ์™„๋ฃŒ.
  • ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋Š” 1๋กœ ๋ฐ”๊ฟ” ์žฌํƒ์ƒ‰ ๋ฐฉ์ง€.

๊ฐ ์ฝ”๋“œ์—์„œ

DFS๊ฐ€ ์“ฐ์ด๋Š” ์ด์œ 

๐Ÿ‘‰ "๋๊นŒ์ง€ ๋“ค์–ด๊ฐ€์„œ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‹ค ๋ณด๊ณ  ๋‚˜์˜ค๋Š” ๋ฐฉ์‹"์ด ํ•„์š”ํ•  ๋•Œ
์˜ˆ: ์—ฐ๊ฒฐ๋œ ๊ตฌ์—ญ, ์กฐํ•ฉ, ๊ฒฝ๋กœ ์กด์žฌ ์—ฌ๋ถ€ ๋“ฑ

"๊ฐˆ ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด, ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ํ™•์ธํ•˜๊ณ  ์˜จ๋‹ค."


BFS๊ฐ€ ์“ฐ์ด๋Š” ์ด์œ 

๐Ÿ‘‰ "๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ณ , ๋‹จ๊ณ„๋ณ„๋กœ ๋„“ํ˜€๊ฐ€๋Š” ๋ฐฉ์‹"์ด ํ•„์š”ํ•  ๋•Œ
์˜ˆ: ์ตœ๋‹จ ๊ฑฐ๋ฆฌ, ์ตœ์†Œ ํšŸ์ˆ˜, ๋ ˆ๋ฒจ ํƒ์ƒ‰ ๋“ฑ

"ํ•œ ์นธ์”ฉ, ๊ฐ€๊นŒ์šด ๊ณณ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•ด์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์„ ์ฐพ๋Š”๋‹ค."


๐ŸŽฏ ํ•ต์‹ฌ ๋น„๊ต ํ•œ ์ค„ ์š”์•ฝ

  • DFS๋Š” "๋๊นŒ์ง€ ํŒŒ๊ณ ๋“ค๋ฉฐ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ"
  • BFS๋Š” "๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ(์ตœ๋‹จ ๊ฑฐ๋ฆฌ)์„ ์ฐพ์„ ๋•Œ"
profile
์ผ๋‹จ ํ•˜๊ณ  ๋ณด์ž (ํŽ ๋ฆฌ์ปจ์  ๋งˆ์ธ๋“œ ใ… ใ… )

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