DFS์™€ BFS

์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ฐœ๋…์„ ์ตํ˜”๋‹ค ํ•ด๋„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ ํ’€์ด์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์—๋Š” ์‰ฝ์ง€ ์•Š์€๋ฐ, ๊ณ„์† ํ’€๋‹ค ๋ณด๋‹ˆ ์ „ํ˜•์ ์ธ ํ’€์ด ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์ธ BFS, DFS ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿ“Œ ๊ฒฐ๊ตญ DFS, BFS์˜ ๊ธฐ๋ณธ ์ž‘๋™ ์›๋ฆฌ๋Š” ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ+๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ → ์ธ์ ‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ+๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ์ด๋‹ค. (*๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์ด์œ  : ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ)

๐Ÿ“Œ ๋‹จ, LIFO(Last-In First-Out)์ธ stack๊ณผ stack memory๋ฅผ ํ™œ์šฉํ•˜๋Š” recursion(์žฌ๊ท€) ↔ FIFO(First-In First-Out)์ธ queue์˜ ํŠน์„ฑ์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ท€๊ฒฐ๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๊ฒ ๋‹ค.

 

 

๊ฐœ๋…

DFS๋ž€?

Depth-First Search : ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
 

 

๐Ÿ“
DFS๋Š” ๋ณดํ†ต Stack, ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ ๊ณผ์ •

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

DFS๋ฅผ ์ ์šฉํ•˜์—ฌ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•

  • ํ•œ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์  ํƒ์ƒ‰ํ•˜๊ธฐ
  • ๊ฒฝ๋กœ ์ฐพ์•„๋‚ด๊ธฐ
  • cycle์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ ์ฐพ๊ธฐ (BOJ 9466๋ฒˆ : ํ…€ํ”„๋กœ์ ํŠธ)

 

BFS๋ž€?

Breadth-First Search : ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
 

 

๐Ÿ“
BFS๋Š” ๋ณดํ†ต Queue๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ ๊ณผ์ •

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค

BFS๋ฅผ ์ ์šฉํ•˜์—ฌ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•

  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ + ์กฐ๊ฑด ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌ (ex: ๋ฐฉ๋ฌธํ•œ ์ง€์ ๋„ ๋‹ค์‹œ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ)

 

 

๊ฐœ๋… ์ ์šฉํ•˜์—ฌ ๋ฌธ์ œ ํ’€๊ธฐ

  DFS, BFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‰ฌ์šด ๋ฌธ์ œ๋“ค์„ ํ’€์–ด๋ณธ๋‹ค.

  ๐Ÿ“ ๋ฌธ์ œ 1. ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

 

๐Ÿ‘‰๐Ÿป
์ด ๋ฌธ์ œ๋Š” ํ•œ ์ •์ ์— ์—ฐ๊ฒฐ๋œ ์ธ์ ‘ ๋…ธ๋“œ๋“ค์„ ์ฐพ๋Š” ๋ฌธ์ œ → DFS!

   ๋ฌธ์ œ ์„ค๋ช…

  • N × M ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€์ด ์žˆ๋‹ค. ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ์นธ๋ง‰์ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋œ๋‹ค.
    ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„๋ผ๋ฆฌ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ๋ถ™์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
    ์ด๋•Œ ์–ผ์Œ ํ‹€์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.
    ๋‹ค์Œ์˜ 4 × 5 ์–ผ์Œ ํ‹€ ์˜ˆ์‹œ์—์„œ๋Š” ์•„์ด์Šคํฌ๋ฆผ์ด ์ด 3๊ฐœ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
๋”๋ณด๊ธฐ

   ์ž…๋ ฅ ์กฐ๊ฑด

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ์–ผ์Œ ํ‹€์˜ ์„ธ๋กœ ๊ธธ์ด N๊ณผ ๊ฐ€๋กœ ๊ธธ์ด M์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.(1 <= N, M <= 1,000)
  • ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์–ผ์Œ ํ‹€์˜ ํ˜•ํƒœ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ด ๋•Œ ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์€ 1์ž…๋‹ˆ๋‹ค.

   ์ถœ๋ ฅ ์กฐ๊ฑด

  • ํ•œ ๋ฒˆ์— ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

   ์ž…๋ ฅ ์˜ˆ์‹œ

4 5
00110
00011
11111
00000

   ์ถœ๋ ฅ ์˜ˆ์‹œ

3

 

๐Ÿ“ ํ’€์ด. DFS ํ™œ์šฉ

# step 1. input ๋ฐ›์•„์„œ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑํ•˜๊ธฐ (input์„ ์ง์ ‘ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.)
n, m = map(int, input().split())
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# step 2. dfs ํ•จ์ˆ˜
def dfs(x, y):
    if x <= -1 or x >= n or y <= -1 or y >= m:      # x๊ฐ€ ๊ทธ๋ž˜ํ”„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ
        return False
    if graph[x][y] == 0:            # ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ’์ด 0์ด๋ฉด == ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ ๋˜์–ด ์žˆ์œผ๋ฉด
        graph[x][y] = 1             # ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ’์„ 1๋กœ ํ•ด์คŒ == ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•จ
        dfs(x-1, y)           # ํ•ด๋‹น ๋…ธ๋“œ๋ถ€ํ„ฐ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์žฌ๊ท€์  ์ ์šฉ
        dfs(x, y-1)
        dfs(x+1, y)
        dfs(x, y+1)
        return True
    return False

# step 3. ๋ฌธ์ œ ํ•ด๊ฒฐ
answer = 0
for j in range(n):
    for k in range(m):
        if dfs(j, k) == True:
            answer += 1

print(answer)

 

  ๐Ÿ“ ๋ฌธ์ œ 2. ๋ฏธ๋กœ ํƒˆ์ถœ

 

๐Ÿ‘‰๐Ÿป
์ด ๋ฌธ์ œ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ → BFS!

   ๋ฌธ์ œ ์„ค๋ช…

  • ๋™๋นˆ์ด๋Š” N × M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜”๋‹ค. ๋ฏธ๋กœ์—๋Š” ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๊ดด๋ฌผ์ด ์žˆ์–ด ์ด๋ฅผ
    ํ”ผํ•ด ํƒˆ์ถœํ•ด์•ผ ํ•œ๋‹ค
  • ๋™๋นˆ์ด์˜ ์œ„์น˜๋Š” (1, 1)์ด๋ฉฐ ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š” (N, M)์˜ ์œ„์น˜์— ์กด์žฌํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ด๋•Œ ๊ดด๋ฌผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์€ 0์œผ๋กœ, ๊ดด๋ฌผ์ด ์—†๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”
    ํ˜•ํƒœ๋กœ ์ œ์‹œ๋œ๋‹ค
  • ์ด๋•Œ ๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ. ์นธ์„ ์…€ ๋•Œ๋Š” ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์„
    ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค
๋”๋ณด๊ธฐ

   ์ž…๋ ฅ ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M (4 <= N, M <= 200)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ M๊ฐœ์˜ ์ •์ˆ˜ (0 ํ˜น์€ 1)๋กœ ๋ฏธ๋กœ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๊ณต๋ฐฑ ์—†์ด ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์€ ํ•ญ์ƒ 1์ž…๋‹ˆ๋‹ค.

   ์ถœ๋ ฅ ์กฐ๊ฑด

  • ์ฒซ์งธ ์ค„์— ์ตœ์†Œ ์ด๋™ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

   ์ž…๋ ฅ ์˜ˆ์‹œ

5 6
101010
111111
000001
111111
111111

   ์ถœ๋ ฅ ์˜ˆ์‹œ

10

 

 

๐Ÿ“ ํ’€์ด 1. BFS ํ™œ์šฉ

from collections import deque

n, m = map(int, input().split())
graph = []
for k in range(n):
    graph.append(list(map(int, input())))

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def bfs(x, y):
    queue = deque()
    queue.append((x, y))
    while queue:
        x, y = queue.popleft()      # ๊ฐ’ ์ถ”์ถœ ๋ฐ queue์—์„œ ์ œ๊ฑฐ
        for di in range(4):
            nx = x + dx[di]
            ny = y + dy[di]
            if nx >= n or nx < 0 or ny >= m or ny < 0:
                continue
            if graph[nx][ny] == 0:
                continue
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
    return graph[n-1][m-1]          # n,m์นธ = graph[n-1][m-1]

print(bfs(0, 0))

 

๐Ÿ“ ํ’€์ด 2. DFS ํ™œ์šฉ

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋Š” BFS์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ง€๋งŒ, queue๋ฅผ stack์œผ๋กœ๋งŒ ๋ฐ”๊พธ๋ฉด ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ bfs๋ฅผ dfs๋กœ ๋ฐ”๊พธ์–ด ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์œ„ ๋ฌธ์ œ๋ฅผ queue๊ฐ€ ์•„๋‹Œ stack์„ ํ™œ์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

n, m = map(int, input().split())
graph = []
for k in range(n):
    graph.append(list(map(int, input())))

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def dfs(x, y):
    stack = []
    stack.append((x, y))
    while stack:
        x, y = stack.pop()      # ๊ฐ’ ์ถ”์ถœ ๋ฐ stack์—์„œ ์ œ๊ฑฐ
        for di in range(4):
            nx = x + dx[di]
            ny = y + dy[di]
            if nx >= n or nx < 0 or ny >= m or ny < 0:
                continue
            if graph[nx][ny] == 0:
                continue
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                stack.append((nx, ny))
    return graph[n-1][m-1]          # n,m์นธ = graph[n-1][m-1]

print(dfs(0, 0))

 

์ด๋ ‡๊ฒŒ BFS, DFS์— ๋Œ€ํ•˜์—ฌ ์‚ดํŽด๋ณด์•˜๋‹ค. ๋‹จ, ์˜ค๋Š˜ ๊นจ๋‹ฌ์€ ์ ์€ DFS, BFS๋ฅผ ์ฒ˜์Œ ์ตํžˆ๋Š” ์ž…์žฅ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋งŒ ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜๋ฃจ ๋‚  ์žก๊ณ  ์ œ๋Œ€๋กœ ๋ช‡ ๋ฌธ์ œ์”ฉ ํ’€๋ฉด์„œ ์ „ํ˜•์ ์ธ ์ฝ”๋“œ๋ฅผ ์ตํžˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•œ ๋“ฏ ํ•˜๋‹ค.

 


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

  • [์ฑ…] ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with Python
  • myeongmy๋‹˜์˜ ๋ธ”๋กœ๊ทธ (https://myeongmy.tistory.com/55)