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

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

Algorithm

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

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

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

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

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

BFS

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ •์ (๋…ธ๋“œ)์™€ ๊ฐ„์„ (์—ฃ์ง€)๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ ์ด๋‹ค.


์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํ์˜ front๋ฅผ ๋นผ๊ณ  ์ขŒํ‘œ์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ํ์— ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

(0,0)์—์„œ ์ƒํ•˜์ขŒ์šฐ์˜ ํŒŒ๋ž€์ƒ‰ ์นธ์„ ํ™•์ธํ•˜์—ฌ (0,1)๊ณผ (1,0)์„ ํ์— ๋„ฃ๋Š”๋‹ค.
(0,1)์„ ํ์—์„œ popํ•ด ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํ™•์ธํ•˜๋ฉด (0,2)๋งŒ ํŒŒ๋ž€์ƒ‰์ด๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ํ์˜ front๋ฅผ pop์‹œํ‚ค๋ฉฐ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

์˜ˆ์‹œ ๊ตฌํ˜„์„ ํ•ด๋ณด์ž

from collections import deque
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)

def bfs(y,x): # ์ขŒํ‘œ์˜ ํ–‰๊ณผ ์—ด์„ x,y๋ฅผ ๋ฐ˜๋Œ€๋กœ ๋„ฃ์–ด์•ผํ•œ๋‹ค. 
  visited=[[False]*M for _ in range(N)]
  dx=[-1,0,0,1] #์—ด
  dy=[0,1,-1,0] #ํ–‰
  
  visited[y][x]=True
  queue=deque()
  queue.append([y,x])
  while queue:
    loc=queue.popleft()
    print(loc[0],loc[1])
    for i in range(4):
      ny=loc[0]+dy[i]  #ํ–‰ ์ขŒํ‘œ ๊ณ„์‚ฐ
      nx=loc[1]+dx[i]  #์—ด ์ขŒํ‘œ ๊ณ„์‚ฐ
      if (ny <0) or (ny>=N) or (nx<0) or( nx>=M):
        continue
      if mat[ny][nx]==1:
        continue
      if not visited[ny][nx]:
        visited[ny][nx]=True
        queue.append([ny,nx])
        
bfs(0,0)

BFS ๋‹จ์ˆœ ์ •๋ฆฌ

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

๋ฐฑ์ค€ ๋ฌธ์ œ 1926 : ์ƒ‰์น ํ•˜๊ธฐ(Flood Fill)

from collections import deque
import sys

n,m=map(int,sys.stdin.readline().split())

pic=[]
for _ in range(n):
  row=list(map(int,sys.stdin.readline().split()))
  pic.append(row)

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


def bfs(visited,y,x):
  temp=0
  dx=[-1,0,0,1] #์—ด ์ขŒ์ƒํ•˜์šฐ
  dy=[0,1,-1,0] #ํ–‰ ์ขŒ์ƒํ•˜์šฐ
  
  visited[y][x]=True
  que=deque()
  que.append([y,x])
  while que:
    value=que.popleft()
    temp+=1
    for i in range(4):
      ny=dy[i]+value[0]
      nx=dx[i]+value[1]
      if nx<0 or nx>=m or ny<0 or ny>=n: #์ขŒํ‘œ๊ฐ€ ๋ฒ—์–ด๋‚˜๋ฉด
        continue
      if pic[ny][nx]==0:
        continue
      if not visited[ny][nx]: #๋ฐฉ๋ฌธ์•ˆํ•œ ๊ทธ๋ฆผ์„ ๋ฐฉ๋ฌธํ•˜๋ฉด
        visited[ny][nx]=True #ํ•ด๋‹น ๊ทธ๋ฆผ์„ ๋ฐฉ๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ณ 
        que.append([ny,nx]) # ํ์— ๋„ฃ๋Š”๋‹ค. 
    
  return temp
        
res=[]
for i in range (n):
  for j in range(m):
    if pic[i][j]==1 and visited[i][j]==False: #๊ทธ๋ฆผ์ด๋ฉฐ ๋ฐฉ๋ฌธํ•œ์ ์ด ์—†์„ ๋•Œ bfs ์‹œ์ž‘
      res.append(bfs(visited,i,j))


print(len(res))
if len(res)==0:
  print(0)
else:
  print(max(res))

์—ฐ์Šต๋ฌธ์ œ ๋ฐฑ์ค€ 2178: ๋ฏธ๋กœ ํƒ์ƒ‰ / ์‘์šฉ : ๊ฑฐ๋ฆฌ ์ธก์ •

from collections import deque
import sys

n,m=map(int,sys.stdin.readline().split())

path=[]
for _ in range(n):
  row=list(map(int,input()))
  path.append(row)


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

def dfs(dist,y,x):
  dx=[-1,0,0,1]
  dy=[0,-1,1,0]
  que=deque()
  que.append([y,x])
  
  dist[y][x]=1
  while que:
    next=que.popleft()
    for i in range(4):
      ny=dy[i]+next[0]
      nx=dx[i]+next[1]
      if nx<0 or ny<0 or ny>=n or nx>=m:
        continue
      if path[ny][nx]==0:
        continue
      if dist[ny][nx]==0: #์•„์ง ๋ฐฉ๋ฌธ์•ˆํ•œ, ๊ฑฐ๋ฆฌ๊ฐ€ 0์œผ๋กœ ํ‘œ์‹œ๋œ ์ง€์ ์„ ๋ฐฉ๋ฌธ
        que.append([ny,nx]) # ํ์— ์ขŒํ‘œ ๋„ฃ๊ณ 
        dist[ny][nx]=dist[next[0]][next[1]]+1 #๊ฑฐ๋ฆฌ๋ฅผ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ฆฌ๊ธฐ
    
dfs(dist,0,0)
print(dist[n-1][m-1])      

BFS๋กœ ํ’€์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ๋น„์Šทํ•ด ๋ณด์ธ๋‹ค.

์—ฐ์Šต๋ฌธ์ œ 3 ๋ฐฑ์ค€ 7576๋ฒˆ ํ† ๋งˆํ† 

์ต์€ ํ† ๋งˆํ† ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด ๊ฒƒ์ธ๊ฐ€?
์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ BFS๋ฅผ ๋™์‹œ์— ๋Œ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.
-> ์—ฌ๋Ÿฌ ์‹œ์ž‘ ์ ์„ ๋™์‹œ์— ํ์— ๋„ฃ๊ณ  BFS๋ฅผ ๋Œ๋ ค๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.

from collections import deque
import sys

n,m=map(int,sys.stdin.readline().split())

tomato=[]
for _ in range(m):
  row=list(map(int,sys.stdin.readline().split()))
  tomato.append(row)


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

que=deque()
for i in range(m):
  for j in range(n):
    if tomato[i][j]==0:
      day[i][j]=-1
    elif tomato[i][j]==1:	# ์ต์€ ํ† ๋งˆํ† ๋ฅผ ๋ชจ๋‘ que์— ๋„ฃ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค. 
      que.append([i,j])
      
while que:
  dx=[-1,0,0,1]
  dy=[0,1,-1,0]
  value=que.popleft()
  for i in range(4):
    ny=value[0]+dy[i]
    nx=value[1]+dx[i]
    if nx<0 or ny<0 or ny>=m or nx>=n:
      continue
    if day[ny][nx]>=0:
      continue
    day[ny][nx]=day[value[0]][value[1]]+1
    que.append([ny,nx])
    
ans=0      
for i in range(m):
  for j in range(n):
    ans=max(ans,day[i][j])

for i in range(m):
  for j in range(n):
    if day[i][j]== -1:  
      ans=-1
          

print(ans)
    
    
profile
๊ณ ๊ฐ์—๊ฒŒ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์•ˆํƒœํ˜„์ž…๋‹ˆ๋‹ค.

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