4์ผ์ฐจ DFS,BFS ๐ŸŒฑ

์ฝ”๋ฆฐ์ด์„œํ˜„์ดยท2025๋…„ 9์›” 2์ผ
0
post-thumbnail

๋“ค์–ด๊ฐ€๋ฉด์„œ

์˜ค๋žœ๋งŒ์ž…๋‹ˆ๋‹ค์š” 
ํ† ์Šค ์‹œํ—˜์ค€๋น„๋•Œ๋ฌธ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž ์‹œ ^^ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ผ๋ฅธ DFS,BFS๋ฅผ ๊ณต๋ถ€ํ•˜๋Ÿฌ ๊ฐ€๋ด…์‹œ๋‹ค

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๊ธฐ์ดˆ : DFS, BFS

ํ•™์Šต ๋ชฉํ‘œ

โœ… ์ธ์ ‘๋ฆฌ์ŠคํŠธ/ํ–‰๋ ฌ ๊ตฌํ˜„
โœ… ์žฌ๊ท€ DFS vs ํ BFS ๋น„๊ต

DFS

  • ํ•ต์‹ฌ ํฌ์ธํŠธ: ๊นŠ๊ฒŒ! ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋๊นŒ์ง€ ๋“ค์–ด๊ฐ€๊ณ , ๋ง‰ํžˆ๋ฉด ๋’ค๋กœ ๋Œ์•„์˜ด.
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•:
    • ์žฌ๊ท€ ๊ตฌํ˜„ (์Šคํƒ ์›๋ฆฌ)
    • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ
  • ํŠน์ง•:
    ๊ฒฝ๋กœ ์ถ”์ , ๋ฐฑํŠธ๋ž˜ํ‚น, ๊ฒฝ์šฐ์˜ ์ˆ˜ ํƒ์ƒ‰์— ์ ํ•ฉ
    ๋ฐฉ๋ฌธ ์ˆœ์„œ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ์ญ‰ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๋А๋‚Œ

๊ตฌํ˜„ ์ฝ”๋“œ

from collections import deque

# ์˜ˆ์‹œ ๊ทธ๋ž˜ํ”„ (์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)
graph = {
    1: [2, 3],
    2: [4, 5],
    3: [6],
    4: [],
    5: [],
    6: []
}

# ----------------
# DFS (์žฌ๊ท€)
# ----------------
def dfs_recursive(v, visited):
    visited.add(v)
    do_something(v)  # <- ์—ฌ๊ธฐ์„œ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์‹œ ์›ํ•˜๋Š” ๋™์ž‘
    print(v, end=" ")
    for nxt in graph[v]:  # ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ ํƒ์ƒ‰ 
        if nxt not in visited: # ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
            dfs_recursive(nxt, visited)

# ----------------
# DFS (์Šคํƒ)
# ----------------
def dfs_stack(start):
    visited = set()
    stack = [start]
    while stack:  # ๋น„์–ด์งˆ๋•Œ๊นŒ์ง€
        v = stack.pop()
        if v not in visited:
            visited.add(v)
            print(v, end=" ")
            # ์—ญ์ˆœ์œผ๋กœ ๋„ฃ์–ด์•ผ ์ž‘์€ ๋ฒˆํ˜ธ ๋จผ์ € ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ
            stack.extend(graph[v])

์™œ DFS๋Š” ์Šคํƒ์„ ์“ฐ๊ณ , ์™œ BFS์—์„œ๋Š” ํ๋ฅผ ์“ธ ๊นŒ

DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๊ณ , BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค.

DFS๋Š” ๊นŠ์ด๊ฐ€ ๋์ธ, ๋” ํƒ์ƒ‰ํ• ๊ฒŒ ์—†๋Š” ๋ฆฌ์ŠคํŠธ์— ๊ฐˆ๋•Œ๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋™์ผ ๋ށ์Šค์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋”๋ผ๋„, ๋‚ด๊ฐ€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋จผ์ € ๊ฐ€์•ผํ•œ๋‹ค.
ํ•ด๋‹น ์ƒํ™ฉ์„ ์‹ค์ œ ์Šคํƒ์˜ ์ƒํƒœ๋กœ ์„ค๋ช…ํ•ด๋ณด์ž

1. ๋…ธ๋“œ A๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ : [(์ด์ „ ๋ށ์Šค ๋…ธ๋“œ), ... ,(๋™์ผ ๋ށ์Šค ๋…ธ๋“œ)] -> ๋…ธ๋“œ A๋ฅผ ๋งจ ๋’ค์—์„œ ๊บผ๋ƒ„
2. ๋…ธ๋“œ A์— ์—ฐ๊ฒฐ๋œ ํ•˜์œ„ ๋…ธ๋“œ์˜ ๋ฆฌ์ŠคํŠธ : graph[A] = [a,b,c]

3. ํ•˜์œ„ ๋…ธ๋“œ ๋‹ด๊ธฐ ๋™์ž‘ ํ›„ : [(์ด์ „ ๋ށ์Šค ๋…ธ๋“œ), ... ,(๋™์ผ ๋ށ์Šค ๋…ธ๋“œ), a, b, c]  

์ดํ›„ ํƒ์ƒ‰ํ•  ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ฐฉ๊ธˆ ์ „์— ๋“ค์–ด์˜จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด๋Š” ์„ ์ž… ํ›„์ถœ์˜ ์Šคํƒ์ด ํ•„์š”ํ•˜๋‹ค. ์•ž์—์„œ ๊บผ๋‚ด๋ฉด, ํ•˜์œ„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ์—‰๋šฑํ•œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋™์ผ ๋ށ์Šค์˜ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์•ผํ•˜๋Š” bfs๋Š” ์„ ์ž… ์„ ์ถœ์˜ ํ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ, DFS์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋•Œ๋ฌธ์— ๋…ธ๋“œ ์ˆœ์„œ๊ฐ€ ๋ฐ˜์ „๋œ๋‹ค๋Š” ๊ฒƒ์„ ์œ ์˜ํ•˜์ž,

BFS

  • ํ•ต์‹ฌ ํฌ์ธํŠธ: ๋„“๊ฒŒ! ์‹œ์ž‘์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰.
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•:
    - ํ(Queue) ์‚ฌ์šฉ (FIFO ์›๋ฆฌ)
  • ํŠน์ง•:
    ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์— ์ž์ฃผ ์‚ฌ์šฉ (ํŠนํžˆ ๊ฐ„์„  ๊ฐ€์ค‘์น˜๊ฐ€ 1์ผ ๋•Œ)
    ๋ฐฉ๋ฌธ ์ˆœ์„œ๊ฐ€ ๋™์‹ฌ์›์ฒ˜๋Ÿผ ํผ์ ธ๋‚˜๊ฐ€๋Š” ๋А๋‚Œ

๊ตฌํ˜„ ์ฝ”๋“œ

from collections import deque

# ์˜ˆ์‹œ ๊ทธ๋ž˜ํ”„ (์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)
graph = {
    1: [2, 3],
    2: [4, 5],
    3: [6],
    4: [],
    5: [],
    6: []
}


# ----------------
# BFS (ํ)
# ----------------
def bfs(start):
    visited = set([start])
    queue = deque([start])
    while queue:
        v = queue.popleft()
        print(v, end=" ")
        for nxt in graph[v]:
            if nxt not in visited:
                visited.add(nxt)
                queue.append(nxt)

์ธ์ ‘ ํ–‰๋ ฌ vs ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

์ธ์ ‘ ํ–‰๋ ฌ: 2์ฐจ์› ๋ฐฐ์—ด, graph[a][b] = 1 ์ด๋ฉด ์—ฐ๊ฒฐ๋จ.

  • ์žฅ์ : ๊ตฌํ˜„ ๊ฐ„๋‹จ, ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ O(1)
  • ๋‹จ์ : ๋ฉ”๋ชจ๋ฆฌ ๋งŽ์ด ์ฐจ์ง€ (O(Nยฒ))

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ: ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ.

  • ์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ (O(N+E))
  • ๋‹จ์ : ํŠน์ • ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ์€ ๋А๋ฆผ

์žฌ๊ท€ DFS vs ํ BFS ๋น„๊ต

๊ตฌ๋ถ„DFSBFS
ํƒ์ƒ‰ ๋ฐฉ์‹๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ
์ž๋ฃŒ๊ตฌ์กฐ์Šคํƒ(์žฌ๊ท€)ํ
ํ™œ์šฉ๊ฒฝ๋กœ ํƒ์ƒ‰, ๋ฐฑํŠธ๋ž˜ํ‚น์ตœ๋‹จ ๊ฑฐ๋ฆฌ, ๋ ˆ๋ฒจ ํƒ์ƒ‰
์†๋„๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋น ๋ฆ„, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ณด์žฅ์€ ์—†์Œ๊ฐ„์„ ์ด ๊ท ์ผํ•˜๋ฉด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ณด์žฅ

โ—๏ธ๊ฐ„์„ ์ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ : ๋…ธ๋“œ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ชจ๋‘ 1๋กœ ๋™์ผ
-> ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” BFS์—์„œ ์–ด๋–ค ๋…ธ๋“œ์— ์ฒ˜์Œ ๋„๋‹ฌํ•œ ์ˆœ๊ฐ„์ด ๊ณง ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ž„์„ ๋ณด์žฅ

์‹ค์ œ ๋ฌธ์ œ ํ’€์–ด๋ณด๊ธฐ

1260 DFS์™€ BFS

  • ํ’€์ด ๋งํฌ : ๐Ÿ”— ๊ฐœ์ธ ๋…ธ์…˜ ๋งํฌ
  • ํ•œ์ค„ ์ •๋ฆฌ : ์ˆซ์ž๋ฆฌ์ŠคํŠธ์š”์†Œ๋ฅผ ๊ณต๋ฐฑ๊ตฌ๋ถ„ํ•ด์„œ ํ•œ์ค„ ์ถœ๋ ฅ print(" ".join(map(str, bfs)))

2606 ๋ฐ”์ด๋Ÿฌ์Šค

2667 ๋‹จ์ง€ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ

2178 ๋ฏธ๋กœํƒ์ƒ‰

  • ํ’€์ด ๋งํฌ : ๐Ÿ”— ๊ฐœ์ธ ๋…ธ์…˜ ๋งํฌ

  • ํ•œ์ค„ ์ •๋ฆฌ : ๊ธฐ์ค€์ธ๋ฑ์Šค์˜ ์œ ํšจํ•œ ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ ๊ตฌํ•˜๊ธฐ

      #์™ธ๋ถ€์—์„œ ์ขŒํ‘œ ์„ค์ •
      dirs = [(-1,0),(1,0),(0,-1),(0,1)] 
      
      #์ƒ๋Œ€ ์ขŒํ‘œ
      for dx, dy in dirs:
        #์ ˆ๋Œ€ ์ขŒํ‘œ๋กœ ๋ณ€๊ฒฝ
        nx, ny = x + dx, y + dy
        
        #์ ˆ๋Œ€ ์ขŒํ‘œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
        if 0 <= nx < n and 0 <= ny < n \
           and grid[nx][ny] == 1 and not visited[nx][ny]:
            # ์›ํ•˜๋Š” ๋™์ž‘
    

๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ์˜ ๋” ์ข‹์€ ์ฝ”๋“œ

๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ฌธ์ œ

  1. ๋ถˆํ•„์š”ํ•œ route ์‚ฌ์šฉ

    ์ฐจ๋ก€๋Œ€๋กœ ์ˆœํšŒํ•ด๋„ ๋™์ผ

  2. get_index ๋ผ๋Š” ํ•จ์ˆ˜ ๋ถˆํ•„์š”

    #์™ธ๋ถ€์—์„œ ์ขŒํ‘œ ์„ค์ •
    dirs = [(-1,0),(1,0),(0,-1),(0,1)] 
    
    #์ƒ๋Œ€ ์ขŒํ‘œ
    for dx, dy in dirs:
      #์ ˆ๋Œ€ ์ขŒํ‘œ๋กœ ๋ณ€๊ฒฝ
      nx, ny = x + dx, y + dy
      
      #์ ˆ๋Œ€ ์ขŒํ‘œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
      if 0 <= nx < n and 0 <= ny < n \
         and grid[nx][ny] == 1 and not visited[nx][ny]:
          # ์›ํ•˜๋Š” ๋™์ž‘

๊ฐœ์„ ์ฝ”๋“œ : ๋‚ด๋ถ€์—์„œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ

import sys
from collections import deque

input = sys.stdin.readline

# ๊นŠ์ด ํƒ์ƒ‰ ์•„๋‹ˆ๋ฉด ๋„ˆ๋น„ ํƒ์ƒ‰?

n = int(input())
arr = [[int(x) for x in input().strip()] for _ in range(n)]
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]

visited = [[0] * n for _ in range(n)]

k = []
sum = 0

stack = deque()

for i in range(n):
    for j in range(n):
        if arr[i][j] == 1 and visited[i][j] != 1:
            stack.append((i, j))
            number = 0

            while stack:
                # ๊บผ๋‚ด๊ธฐ
                x, y = stack.pop()
                # ๋ฐฉ๋ฌธ ๊ฒ€์‚ฌ์™€ ๋ฐฉ๋ฌธ ํ‘œ์‹œ
                if visited[x][y] == 1:
                    continue
                visited[x][y] = 1
                number += 1
                for dx, dy in dirs:
                    nx, ny = x + dx, y + dy
                    if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 1:
                        stack.append((nx, ny))

            if number != 0:
                k.append(number)

k.sort()
print(len(k))
for x in k:
    print(x)

๊ฐœ์„ ์ฝ”๋“œ : push ์ „์— ๋ฐฉ๋ฌธ ๊ฒ€์‚ฌ

import sys
from collections import deque

input = sys.stdin.readline

# ๊นŠ์ด ํƒ์ƒ‰ ์•„๋‹ˆ๋ฉด ๋„ˆ๋น„ ํƒ์ƒ‰?

n = int(input())
arr = [[int(x) for x in input().strip()] for _ in range(n)]
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]

visited = [[0] * n for _ in range(n)]

k = []
sum = 0

stack = deque()

for i in range(n):
    for j in range(n):
        if arr[i][j] == 1 and visited[i][j] != 1:
            stack.append((i,j))
            visited[i][j] = 1
            number = 1

            while stack:
                # ๊บผ๋‚ด๊ธฐ
                x, y = stack.pop()

                for dx, dy in dirs:
                    nx, ny = x + dx, y + dy
                    if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 1 and visited[nx][ny] != 1:
                        visited[nx][ny] = 1
                        number += 1
                        stack.append((nx, ny))

            if number != 0:
                k.append(number)

k.sort()
print(len(k))
for x in k:
    print(x)

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ

๋” ์—ด์‹ฌํ•˜์ž
profile
ํฌ๊ธฐ๋งŒ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ธ์  ๊ฐ„ ๋„๋‹ฌํ•œ๋‹ค!

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