๐Ÿšถโ€โ™‚๏ธRoad to ์ฝ”ํ…Œ(9) - DFS

์•ˆํƒœํ˜„ยท2024๋…„ 12์›” 26์ผ

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
9/15

๋ณธ ๊ฒŒ์‹œ๋ฌผ์€ BaaarkingDog๋‹˜์˜ ์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[์ถ”๊ฐ€] ์šฉ๊ฐํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์ถ”๊ฐ€] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ - ํŒŒ์ด์ฌ

[์ถ”๊ฐ€] ์ขŒ์ถฉ์šฐ๋Œ, ํŒŒ์ด์ฌ์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„ํ•˜๊ธฐ

DFS

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๊นŠ์ด๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ณผ์ •

  1. ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ ๋‚จ๊น€
  2. ์Šคํƒ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด ๊ทธ ์นธ๊ณผ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์— ๋Œ€ํ•ด
  3. ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ์Šคํƒ์— ์‚ฝ์ž…
  4. ์Šคํƒ์ด ๋นŒ ๋•Œ ๊นŒ์ง€ 2๋ฒˆ์„ ๋ฐ˜๋ณต
    ๋ชจ๋“  ์นธ์ด ์Šคํƒ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์นธ์ด N๊ฐœ์ผ ๋•Œ O(N).
    โ€ป ํ๋ฅผ ์“ฐ๋ฉด BFS์ด๊ณ  ์Šคํƒ์„ ์“ฐ๋ฉด DFS์ด๋‹ค.

BFS์—์„œ๋Š” popleft๋ฅผ ํ–ˆ๋‹ค๋ฉด DFS์—์„œ๋Š” pop์„ ํ•œ๋‹ค. ์ฆ‰ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๊ฒƒ์„ ๋จผ์ € ํƒ์ƒ‰ํ•œ๋‹ค.

BFS์—์„œ ์‹œ์ž‘์ ์„ ์ค‘์•™์œผ๋กœ ์žก์•˜๋‹ค๋ฉด ์ƒํ•˜์ขŒ์šฐ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
DFS์—์„œ๋Š” ์‹œ์ž‘์ ์„ ์ค‘์•™์œผ๋กœ ์žก์•˜๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๋ถ„๊ธฐ์ ์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด์•ผ ๋‹ค์Œ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ, ํ˜„์žฌ ๋ณด๋Š” ์นธ์œผ๋กœ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜๋Š” ์ธ์ ‘ํ•œ ์นธ์€ ๊ฑฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๋ณด๋Š” ์นธ๋ณด๋‹ค 1๋งŒํผ ๋” ๋–จ์–ด์ ธ ์žˆ๋‹ค๋Š” ์„ฑ์งˆ์ด DFS์—์„œ๋Š” ์„ฑ๋ฆฝ ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ฆ‰, ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์‹œ DFS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ฒฐ๊ตญ, ๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ BFS ๋Œ€์‹  DFS๋ฅผ ์จ์•ผํ•˜๋Š” ์ผ์ด ์—†๋‹ค.
-> DFS๋Š” ํŠธ๋ฆฌ์™€ ๊ทธ๋ž˜ํ”„์—์„œ ํ•„์š”ํ•˜๋ฏ€๋กœ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์กฐ

import sys

N, M = map(int, sys.stdin.readline().split())
mat = [
  [0, 1, 1, 1, 1, 1],
  [0, 1, 0, 0, 0, 1],
  [0, 1, 0, 1, 0, 1],
  [0, 1, 0, 1, 0, 0],
  [0, 0, 0, 1, 1, 0],
  [1, 1, 1, 1, 1, 0]
  ]
# for _ in range(N):
#     row = list(map(int, input().split()))
#     mat.append(row)
print(mat)


visited=[[False]*M for _ in range(N)]

def DFS(visited,y,x):
  dx=[-1,0,0,1]
  dy=[0,1,-1,0]
  visited[y][x]=True
  stack=[]
  stack.append([y,x])
    
  
  while stack:
    value=stack.pop()
    for i in range(4):
      nx=value[1]+dx[i]
      ny=value[0]+dy[i]
      if (ny<0 or nx<0  or ny>=M or nx>=N):
        continue
      if mat[ny][nx]==1:
        continue
      if not visited[ny][nx]:
        stack.append([ny,nx])
        visited[ny][nx]=True
      
DFS(visited,0,0)
profile
๊ณ ๊ฐ์—๊ฒŒ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์•ˆํƒœํ˜„์ž…๋‹ˆ๋‹ค.

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