โ๏ธ ์ค์๊ธ์ BFS/DFS ์ ํ์ ๊ทธ๋ํ ์ฐ๊ฒฐ ์์ / ์ฐ๊ฒฐ ์์ ๋ด์ ๋ ธ๋ ๊ฐ์ / ์ต๋จ ๊ฑฐ๋ฆฌ(Easy) 3๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค.
โ 11724 ์ฐ๊ฒฐ ์์์ ๊ฐ์ โ

โ๏ธ DFS
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10000)
N,M=map(int,input().split())
#dfs
def dfs(graph,start,visited):
visited[start] = True
for node in graph[start]:
if not visited[node]:
dfs(graph,node,visited)
#graph
graph=[[] for _ in range(N+1)]
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
#visited
visited=[False]*(N+1)
ans=0
for node_num in range(1,N+1):
if visited[node_num] == False:
dfs(graph,node_num,visited)
ans+=1
print(ans)
โ๏ธ BFS
import sys
input=sys.stdin.readline
from collections import deque
N,M=map(int,input().split())
def bfs(graph,start,visited):
queue = deque([start])
visited[start] = True
while queue:
node = queue.popleft()
for i in graph[node]:
if not visited[i]:
queue.append(i)
visited[i]=True
#graph
graph=[[] for _ in range(N+1)]
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
#visited
visited=[False]*(N+1)
num_of_connected_components = 0
for node in range(1,N+1):
if visited[node] == False:
bfs(graph,node,visited)
num_of_connected_components+=1
print(num_of_connected_components)
โ๏ธ ๊ทธ๋ํ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ์ํ์์, ์๋ก ์ฐ๊ฒฐ๋ node ๋ฌถ์์ ๊ฐ์ - ์ฆ ์ฐ๊ฒฐ ์์ (connected components)์ ๊ฐ์๋ฅผ ๋ฌป๋ ๋ฌธ์
โ๏ธ ์ฐ๊ฒฐ์์์ ๊ฐ์๋ฅผ ์ฐพ๊ธฐ ์ํด์๋,
โ ๊ฐ node๋ณ๋ก(1๋ถํฐ ์์)
โก visited ์ ๋ฌด๊ฐ False๋ผ๋ฉด, dfs / bfs graph searching์ ์งํํด ์ฐ๊ฒฐ node๋ค์ ๋ชจ๋ visited True๋ก ํด์ค
โข ํ ๋ฒ์ searching์ผ๋ก ํ ๊ฐ์ ๋ฌถ์์ด ์๊ธฐ๋ฉฐ ๊ณ์ counting
โฃ ์ดํ False์ธ ์์ node๋ฅผ ๋ ์ฐพ์ ๊ณ์ dfs/bfs ์งํ
โค updateํ๋ฉฐ add up๋๋ ๋ณ์ ์ต์ข ์ฐ๊ฒฐ์์์ ๊ฐ์๋ฅผ print
โ ํต์ฌ: ๋ชจ๋ node for๋ฌธ์ผ๋ก ๋๋ ค not visited๋ผ๋ฉด dfs / bfs searching ์งํํ๊ณ , ์ฐ๊ฒฐ์์ ๊ฐ์ += 1 โ
โ๏ธ ์ฆ! ๊ทธ๋ํ ์ฐ๊ฒฐ์์์ ๊ฐ์ ์ฐพ๊ธฐ๋ visited=False์ ๋ชจ๋ node๋ฅผ ์์ node๋ก dfs/bfs ์งํํ๋ฉฐ counting add up!
โ 1012 ์ ๊ธฐ๋ ๋ฐฐ์ถ โ

import sys
input=sys.stdin.readline
sys.setrecursionlimit(10000)
def dfs(l,i,j):
if l[i][j] == 1:
l[i][j]=0
if (i-1)>=0: dfs(l,i-1,j)
if (i+1)<=(M-1): dfs(l,i+1,j)
if (j-1)>=0: dfs(l,i,j-1)
if (j+1)<=(N-1): dfs(l,i,j+1)
return True
for _ in range(int(input())):
caterpillars=0
M,N,K=map(int,input().split())
#area
area=[[0]*N for _ in range(M)]
for _ in range(K):
X,Y=map(int,input().split())
area[X][Y] = 1
for i in range(M):
for j in range(N):
if area[i][j] == 1:
dfs(area,i,j)
caterpillars+=1
print(caterpillars)
โ๏ธ ๊ทธ๋ํ ์ด๋ก ์ ์ ํ์ ์ธ ์ฐ๊ฒฐ์์ ๊ฐ์ ๊ตฌํ๊ธฐ
โ๏ธ ๊ฐ ๊ทธ๋ํ๋ฅผ ๋๋ฉด์ 1์ด๋ฉด, dfs๋ฅผ ์ํํด ์/ํ/์ข/์ฐ 1์ธ์ง recursiveํ๊ฒ ํ์ธ. 1์ด๋ฉด ๋ชจ๋ 0์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ชจ๋ dfs๊ฐ ๋๋ฌ๋ค๋ ๊ฑด ํ ๊ฐ์ ๋ฌถ์ ํ์ฑ ๋ง๋ฌด๋ฆฌ โ ๋ฌถ์ ๊ฐ์ counting 1 ์ถ๊ฐ
โ๏ธ dfs์์ ํญ์ ์์๊ฐ 1์ผ ๋๋ถํฐ ์์ํ๋ฏ๋ก ๋ชจ๋ recursion์ด ๋ง๋ฌด๋ฆฌ ๋๋ฉด ๋ง์ง๋ง์ ์ต์ข ์ ์ผ๋ก True๋ก ํจ์ ๋๋ (๋ฆฌํด๋ง ํ๋ฉด ๋จ)
โ 4963 ์ฌ์ ๊ฐ์ โ

import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**9)
def dfs(graph,i,j):
if graph[i][j]==1:
graph[i][j]=0
if (i-1)>=0:
dfs(graph,i-1,j)
if (i+1)<=(h-1):
dfs(graph,i+1,j)
if (j-1)>=0:
dfs(graph,i,j-1)
if (j+1)<=(w-1):
dfs(graph,i,j+1)
if (i-1)>=0 and (j-1)>=0:
dfs(graph,i-1,j-1)
if (i-1)>=0 and (j+1)<=(w-1):
dfs(graph,i-1,j+1)
if (i+1)<=(h-1) and (j-1)>=0:
dfs(graph,i+1,j-1)
if (i+1)<=(h-1) and (j+1)<=(w-1):
dfs(graph,i+1,j+1)
return True
while 1:
w,h=map(int,input().split())
if (w,h) == (0,0): break
#graph
graph=[]
for _ in range(h):
graph.append(list(map(int,input().split())))
n=0
for i in range(h):
for j in range(w):
if graph[i][j] == 1:
dfs(graph,i,j)
n+=1
print(n)
โ๏ธ ๋ค๋ง, ๋๊ฐ์ 4๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๋ค๋ ์กฐ๊ฑด๋ง ์ถ๊ฐ๋จ. 4๊ฐ์ if๋ฌธ๋ง ์ถ๊ฐํ๋ฉด ๋
โ 2667 ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ โ

import sys
input=sys.stdin.readline
from collections import deque
def bfs(graph,start_x,start_y,n,queue):
queue.append((start_x,start_y))
while queue:
v = queue.popleft()
x,y=v[0],v[1]
if 0<=(x-1):
if graph[x-1][y] == 1:
queue.append((x-1,y))
graph[x-1][y]=0
n+=1
if (x+1)<=(N-1):
if graph[x+1][y]==1:
queue.append((x+1,y))
graph[x+1][y]=0
n+=1
if 0<=(y-1):
if graph[x][y-1]==1:
queue.append((x,y-1))
graph[x][y-1]=0
n+=1
if (y+1)<=(N-1):
if graph[x][y+1]==1:
queue.append((x,y+1))
graph[x][y+1]=0
n+=1
return n
N=int(input())
num_of_towns=0
num_of_towns_list=[]
#graph
graph=[]
for _ in range(N):
graph.append(list(map(int,input().rstrip())))
for i in range(N):
for j in range(N):
if graph[i][j]==1:
graph[i][j]=0
num_of_towns+=1
num_of_houses=1
queue=deque()
num_of_towns_list.append(bfs(graph,i,j,num_of_houses,queue))
print(num_of_towns)
print(*sorted(num_of_towns_list),sep='\n')
โ๏ธ ์ฐ๊ฒฐ์์์ ๊ฐ์ + ์ฐ๊ฒฐ์์ ๋ด์ ๋ ธ๋ ๊ฐ์๋ฅผ ๋ฌป๋ ๋ฌธ์ ์ ํ
โ๏ธ ์ฆ, ์ฐ๊ฒฐ์์ ๊ฐ์๋ฅผ ๋ฌป๋ ์ ํ์ ์ธ ๋ฌธ์ ์ ํ์์, ์ถ๊ฐ๋ก ๊ฐ ์ฐ๊ฒฐ์์ ๋ด์ ๋ ธ๋๊ฐ ๋ช ๊ฐ ์ธ์ง๊น์ง ๋ฌป๋ ๋ฌธ์
โ๏ธ ์ด๋ฒ์๋ BFS๋ก ํ์๋ค.
โ ๋งค ๋ฒ ์ฐ๊ฒฐ์์ ๋ฌถ์์ ์ฐพ์ ๋๋ง๋ค, queue ์ด๊ธฐํ, ๋ฌถ์ ๊ฐ์ ๋ณ์ 1 ์ฆ๊ฐ, ์ฐพ์ ๋ถ๋ถ 0์ผ๋ก ์ค์ , ๋ ธ๋ ๊ฐ์ ๋ณ์ 0 ์ค์
โก BFSํจ์ ๋ด์์๋ ๋จผ์ start queue์ ๋ฃ๊ณ
โ while queue๋ฌธ
(1) queue์์ popleft()๋ก ์ ์ผ ๋จผ์ queue์ ๋ฃ์ node ์ถ์ถ.
(2) ์ด ๋ค ๋ฐฉํฅ๋ณ๋ก ๋ ธ๋๊ฐ์ด 1์ธ์ง ํ์ธ, 1์ธ์ง ํ์ธํ๋ฉด visited ๋์์
โ queue์ ๋ฃ์
โ ํด๋น graph๊ฐ 0 ์ค์
โ ๋ ธ๋ ๊ฐ์ ๋ณ์ 1 ์ฆ๊ฐ
โ 1926 ๊ทธ๋ฆผ โ


import sys
input = sys.stdin.readline
from collections import deque
def BFS(paper, n, m, visited, start):
area=1
queue = deque([start])
visited[start[0]][start[1]] = True
dx,dy=[1,-1,0,0],[0,0,1,-1]
while queue:
v=queue.popleft()
for i in range(4):
nx,ny=v[0]+dx[i],v[1]+dy[i]
if 0<=nx<n and 0<=ny<m:
if not visited[nx][ny] and paper[nx][ny]==1:
visited[nx][ny]=True
area+=1
queue.append((nx,ny))
return area
n,m=map(int,input().split())
paper=[]
visited=[[0]*m for _ in range(n)]
for _ in range(n):
paper.append(list(map(int,input().split())))
areas=[]
num_area=0
for i in range(n):
for j in range(m):
if paper[i][j]==1 and not visited[i][j]:
areas.append(BFS(paper,n,m,visited,(i,j)))
num_area+=1
if num_area==0:
print(0,0,sep='\n')
else:
print(num_area,max(areas),sep='\n')
โ๏ธ ์ 2667 ์ฐ๊ฒฐ์์ ๊ฐ์ + ์ฐ๊ฒฐ์์ ๋์ด ์ ํ๊ณผ ๋์ผ
โ 2468 ์์ ์์ญ โ



import sys, copy
input = sys.stdin.readline
sys.setrecursionlimit(10000)
N=int(input())
graph=[]
ans=1
def dfs(graph, i, j, N, limit):
if (i-1)>=0 and not visited[i-1][j] and graph[i-1][j] > limit:
visited[i-1][j] = True
dfs(graph,i-1,j,N,limit)
if (i+1)<N and not visited[i+1][j] and graph[i+1][j] > limit:
visited[i+1][j] = True
dfs(graph,i+1,j,N,limit)
if (j-1)>=0 and not visited[i][j-1] and graph[i][j-1] > limit:
visited[i][j-1] = True
dfs(graph,i,j-1,N,limit)
if (j+1)<N and not visited[i][j+1] and graph[i][j+1] > limit:
visited[i][j+1] = True
dfs(graph,i,j+1,N,limit)
return True
for _ in range(N):
l=list(map(int,input().split()))
graph.append(l)
max_h = max(map(max,graph))
for limit in range(max_h):
visited=[[0]*N for _ in range(N)]
n=0
for i in range(N):
for j in range(N):
if not visited[i][j] and graph[i][j] > limit:
dfs(graph,i,j,N,limit)
n+=1
ans=max(ans,n)
print(ans)
โ๏ธ ์ ํ์ ์ธ ์ฐ๊ฒฐ์์ ๊ฐ์ ๋ฌธ์
+ 2์ฐจ์ ๊ทธ๋ํ์์ ์ต๋,์ต์๋ max(map(max,graph))์ธ mapํจ์๋ก ํ๋ฒ์ ๊ตฌํ๊ธฐ ๊ฐ๋ฅ
+ dfs๋ก ํ์์ง๋ง ์๋ฐฉํฅ์ผ๋ก ์งํํ๋ ์ฐ๊ฒฐ์์ ๊ฐ์ ๊ตฌํ๊ธฐ๋ bfs ์ถ์ฒ
โ 2583 ์์ญ ๊ตฌํ๊ธฐ โ


import sys
input = sys.stdin.readline
from collections import deque
def BFS(graph, N, M, v, visited, square):
dx=[0,0,1,-1]
dy=[1,-1,0,0]
queue=deque([v])
visited[v[0]][v[1]] = True
while queue:
nv = queue.popleft()
for i in range(4):
nx=nv[0]+dx[i]
ny=nv[1]+dy[i]
if nx>=0 and nx<M and ny>=0 and ny<N:
if graph[nx][ny]!='!' and not visited[nx][ny]:
visited[nx][ny] = True
queue.append((nx,ny))
square+=1
return square
M,N,K=map(int,input().split())
area_cnt,area=0,[]
#forming a graph
graph=[[0]*N for _ in range(M)]
for _ in range(K):
x1,y1,x2,y2=map(int,input().split())
for x in range(M-1-(y2-1),M-1-(y1)+1):
for y in range(x1,x2):
graph[x][y]='!'
visited=[[0]*N for _ in range(M)]
for x in range(M):
for y in range(N):
if not visited[x][y] and graph[x][y] != '!':
area_cnt+=1
square=1
area.append(BFS(graph, N, M, (x,y), visited, square))
print(area_cnt)
print(*sorted(area))
โ๏ธ ์ง์ฌ๊ฐํ์ ๋ ์ขํ๋ก ์ฃผ์ด์ง ๊ทธ๋ํ !๋ก ์ฑ์ฐ๊ธฐ(์ด ๋, ๋ฌธ์ ์์์ (x,y)์ ๊ทธ๋ํ์์์ (x,y)๊ฐ ๋ฌ๋ผ ๊ฐ๋ก/์ธ๋ก ๊ท์น ์ฐพ๊ณ ์ด์ ๋ง๊ฒ ๋ฐฐ์น

โ๏ธ BFS์์ ์ํ์ข์ฐ ์๋ฐฉํฅ dx, dy ๋ฒกํฐ ๋ง๋ค๊ณ for _ in range(4)๋ฌธ ๋๋ ค nx์ ny ๋ง๋ ๋ค์ nx์ ny ๋ฒ์์ ์๋ ์ง ํ์ธ์ด ์ฌ๋ฌ if๋ฌธ ์์ฑ๋ณด๋ค ๋ ๊ฐ๊ฒฐ.
โ๏ธ area์ ๊ฐ์๋ ์ฐ๊ฒฐ์์์ ๊ฐ์: for๋ฌธ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด +=1 / area ๋์ด๋ ์ฐ๊ฒฐ์์๋ง๋ค ๊ธฐ์กด 1์์ ๋ํ๋๋ง๋ค, ์ฆ queue์ ๋ค์ด๊ฐ ์์๊ฐ ์๊ธธ ๋๋ง๋ค +=1
โ 14940 ์ฌ์ด ์ต๋จ๊ฑฐ๋ฆฌ โ


import sys
input = sys.stdin.readline
from collections import deque
def BFS(area, n, m, visited, start, depths):
queue = deque([start])
visited[start[0]][start[1]] = True
depths[start[0]][start[1]] = 0 #goal
dx,dy=[1,-1,0,0],[0,0,1,-1]
while queue:
v=queue.popleft()
for i in range(4):
nx,ny=v[0]+dx[i],v[1]+dy[i]
if 0<=nx<n and 0<=ny<m:
if not visited[nx][ny]:
visited[nx][ny]=True
if area[nx][ny]!=0:
depths[nx][ny] = depths[v[0]][v[1]]+1
queue.append((nx,ny))
return area
n,m=map(int,input().split())
area,ans=[],[]
gx,gy=0,0
visited=[[0]*m for _ in range(n)]
depths=[[-1]*m for _ in range(n)]
row_ind=0
for _ in range(n):
l = list(map(int,input().split()))
for i in range(len(l)):
if l[i] == 2:
gx,gy=row_ind,i
elif l[i] == 0:
depths[row_ind][i] = 0
area.append(l)
row_ind+=1
BFS(area, n, m, visited, (gx,gy), depths)
for i in depths:
print(*i)
โ๏ธ ๋ชฉํ์ง์ ์์ BFS ์์ํด ๋ชจ๋ node์ ์ต๋จ๊ฒฝ๋ก, ์ฆ depth ๊ตฌํ๋ ์ ํ์ ์ธ ์ต๋จ๊ฑฐ๋ฆฌ ์ ํ
โ๏ธ + ๋ค๋ง ๋๋ฌ์ด ์๋ ์๋๋ 0 ์ง์ ์ 0 ์ง์ : graph ๋ง๋ค๋ฉด์ ๋งํน
/ ๋๋ฌ ๊ฐ๋ฅํ๋ ๋๋ฌ ๋ชปํ๋ ์ง์ ์ธ -1์ -1๋ก ์ด๊ธฐํํ depth์์ ์์
โ 1743 ์์๋ฌผ ํผํ๊ธฐ โ


import sys
input = sys.stdin.readline
from collections import deque
N,M,K=map(int,input().split())
graph=[['.']*M for _ in range(N)]
visited=[[False]*M for _ in range(N)]
cur_max=0
def BFS(graph, visited, i, j, area):
queue = deque([(i,j)])
visited[i][j] = True
dx,dy=[0,0,1,-1],[1,-1,0,0]
while queue:
v = queue.popleft()
for k in range(4):
nx,ny=v[0]+dx[k],v[1]+dy[k]
if 0<=nx<N and 0<=ny<M:
if not visited[nx][ny] and graph[nx][ny] == '#':
area+=1
queue.append((nx,ny))
visited[nx][ny] = True
return area
for _ in range(K):
r,c=map(int,input().split())
graph[r-1][c-1]='#'
for i in range(N):
for j in range(M):
if graph[i][j] == '#' and not visited[i][j]:
area=1
cur_max=max(cur_max,BFS(graph, visited, i, j, area))
print(cur_max)
โ๏ธ #์ ํด๋นํ๋ ์์๋ฌผ, ์ฆ ์ฐ๊ฒฐ ๋ ธ๋ ์์ญ ๋์ด ๊ตฌํ๊ธฐ ์ ํ
โ 1303 ์ ์ - ์ ํฌ โ


import sys
input = sys.stdin.readline
from collections import deque
N,M=map(int,input().split())
visited=[[False]*N for _ in range(M)]
graph=[[] for _ in range(M)]
me,you=0,0
def BFS(graph, visited, start, color, area):
queue=deque([start])
visited[start[0]][start[1]] = True
dx,dy=[-1,1,0,0],[0,0,-1,1]
while queue:
x,y=queue.popleft()
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if 0<=nx<M and 0<=ny<N:
if not visited[nx][ny]:
if graph[nx][ny] == color:
area+=1
visited[nx][ny]=True
queue.append((nx,ny))
return area
for i in range(M):
line=list(input().rstrip())
graph[i] = line
#me
for i in range(M):
for j in range(N):
if graph[i][j] == 'W':
if not visited[i][j]:
area=1
area=BFS(graph,visited,(i,j),'W',area)
me+=(area*area)
else: #'B'
if not visited[i][j]:
area=1
area=BFS(graph,visited,(i,j),'B',area)
you+=(area*area)
print(me,you)
โ๏ธ W์ B ๊ฐ๊ฐ์ ์ฐ๊ฒฐ๋ ธ๋ ๋์ด ๊ตฌํ๋ ์ ํ. ์ด ๋ ๋จ 1๊ฐ์ ํจ์ BFS๋ง ํจ์จ์ ์ผ๋ก ์ฌ์ฉ. W์ B ๊ฐ๊ฐ traversingํ๋ฏ๋ก visited์์ ๊ฒน์น ์ผ ์์ผ๋ฏ๋ก visited๋ ํ ๋ฒ๋ง ์ฌ์ฉ
โ 3184 ์ โ


import sys
input = sys.stdin.readline
from collections import deque
R,C=map(int,input().split())
graph=[]
visited=[[False]*C for _ in range(R)]
def bfs(graph, visited, start, l, w):
x,y=start[0],start[1]
visited[x][y] = True
queue=deque([start])
dx,dy=[0,0,-1,1],[-1,1,0,0]
if graph[x][y] == 'o': l+=1
elif graph[x][y] == 'v': w+=1
while queue:
v = queue.popleft()
for i in range(4):
nx,ny=v[0]+dx[i],v[1]+dy[i]
if 0<=nx<R and 0<=ny<C:
if not visited[nx][ny] and graph[nx][ny]!='#':
visited[nx][ny]=True
queue.append((nx,ny))
if graph[nx][ny] == 'o':
l+=1
elif graph[nx][ny] == 'v':
w+=1
return (l,w)
for _ in range(R):
graph.append(list(input().rstrip()))
lamb,wolf=0,0
for i in range(R):
for j in range(C):
if not visited[i][j] and graph[i][j] != '#':
l,w=0,0
lw = bfs(graph, visited, (i,j), l, w)
if lw[0] > lw[1]:
lamb+=lw[0]
else:
wolf+=lw[1]
print(lamb, wolf)
โ๏ธ ๊ฐ ์ฐ๊ฒฐ ์์ญ๋ณ๋ก ์๊ณผ ๋๋์ ์๋ฅผ ๊ฐ๊ฐ ์นด์ดํธํ๊ณ ์๊ณผ ๋๋์ ๋์๊ด๊ณ์ ๋๋ผ lamb, wolf ์ต์ข ๋ณ์๊ฐ ์ถ๋ ฅ
โ 1325 ํจ์จ์ ์ธ ํดํน โ


import sys
input=sys.stdin.readline
from collections import deque
def bfs(graph, visited, start):
visited[start] = True
queue=deque([start])
ans=0
while queue:
v = queue.popleft()
for nv in graph[v]:
if not visited[nv]:
ans+=1
visited[nv]=True
queue.append(nv)
return ans
N,M=map(int,input().split())
graph=[[]for _ in range(N+1)]
for _ in range(M):
A,B=map(int,input().split())
graph[B].append(A)
hackable_nums=[0]
for start in range(1,N+1):
visited=[False]*(N+1)
hackable_nums.append(bfs(graph, visited, start))
ans_num=max(hackable_nums)
for x in range(len(hackable_nums)):
if hackable_nums[x] == ans_num:
print(x,end=' ')
โ๏ธ A๊ฐ B๋ฅผ ์ ๋ขฐํ๋ค๋ ๊ฑด, graph[B]์ A๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค๋ ๋ป์ด๊ณ graph[A]์ B ์ฐ๊ฒฐ์ ์๋๋ค. (์๋ฐฉํฅ์ด ์๋์ ์ฃผ์)
โ๏ธ BFS๋ก ๋ฐฉ๋ฌธํ๋ node ๊ฐ์ ์นด์ดํธ
โ 17086 ์๊ธฐ ์์ด 2 โ


import sys
input=sys.stdin.readline
from collections import deque
N,M=map(int,input().split())
graph,dist=[],[[-1]*M for _ in range(N)]
dx,dy=[0,0,-1,1,1,1,-1,-1],[-1,1,0,0,1,-1,-1,1]
def BFS(node):
queue=deque([node])
while queue:
v=queue.popleft()
x,y,d=v[0],v[1],v[2]
for i in range(8):
nx,ny=x+dx[i],y+dy[i]
if 0<=nx<N and 0<=ny<M:
if (d+1)<dist[nx][ny] or dist[nx][ny] == -1:
dist[nx][ny] = (d+1)
queue.append((nx,ny,d+1))
for x in range(N):
l=list(map(int,input().split()))
graph.append(l)
for x in range(N):
for y in range(M):
if graph[x][y] == 1:
dist[x][y] = 0
BFS((x,y,0))
print(max(max(x) for x in dist))
โ๏ธ ๊ฐ ์์ด๋ณ๋ก ์๊ธฐ ์์ ์ ๊ฑฐ๋ฆฌ๊ฐ 0์ผ๋ก ์ค์ , 8๋ฐฉํฅ ๋ป์ด๋๊ฐ๋ฉด์ dist ๊ฑฐ๋ฆฌ depth๋ก 1์ฉ ์ฆ๊ฐ.
โ ์ด ๋ ์์ด๋ณ๋ก visited ๋ฐฐ์ด ์ ์ธํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ. update๋๋ dist๋ฅผ ๊ธฐ์ค์ผ๋ก queue์ (x,y,d) append ์ฌ๋ถ ๊ฒฐ์ . ์ผ๋จ ์ฒซ ์์ด์ผ ๊ฒฝ์ฐ dist๊ฐ์ด -1์ผ ๋ ๋ชจ๋ append / ์ด๋ฏธ update๋ dist๋ผ๋ฉด, d+1(ํ์ฌ ์์ด ๊ธฐ์ค ๊ฑฐ๋ฆฌ)์ด ๊ธฐ์กด dist[nx][ny]๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ง queue์ append. ์์ง ์๋ค๋ฉด ์์ผ๋ก ๋ ์งํํด๋ ์ด๋ฏธ ๊ฑฐ๋ฆฌ๋ ์ ์ +1์ฉ ์ฆ๊ฐํ๋ฉด์ ํ์ํ ํ์๊ฐ ์๊ธฐ์(์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๋ฏ๋ก) append ํ์ ์์.

: ์ ์์๋ฅผ ๋ณด๋ฉด ์ฒซ๋ฒ์งธ ์์ด(2ํ)๋ฅผ ์ถ๋ฐ์ ์ผ๋ก dist update ์ดํ ๋๋ฒ์งธ ์์ด(3ํ)์ ์ถ๋ฐ์ ์ผ๋ก dist updateํ๋ ค๊ณ ํ ๋, ์, ์ค๋ฅธ์ชฝ ์, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ ์ซ์๊ฐ ํ์ฌ ๋๋ฒ์งธ ์์ด dist + 1 ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ์ฆ, ์ดํ ์๋ฌด๋ฆฌ ์งํํ๋ ค๊ณ ํด๋ ์๋ฏธ๊ฐ ์๋ค๋ ๋ป(์ด์ฐจํผ ๋ ์ปค์ง๊ฑฐ๋ ๊ฐ๊ธฐ๋ง ํ ๋ฟ. ์ต์๊ฐ์ ๊ตฌํ๋ ค๋ ๋ฌธ์ ์ ์๋๊ฐ ์๋๋ค)
โ visited[] ๋ฐฐ์ด ์ฌ์ฉ ์์ด, update๋๋ dist๋ก node๋ฅผ queue์ append ํ ์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ค๋ ์ ๊ธฐ์ตํ๊ธฐ
โ 16174 ์ ํ์ ์ ค๋ฆฌ (Large) โ


import sys
input=sys.stdin.readline
from collections import deque
N=int(input())
graph,visited=[],[[False]*N for _ in range(N)]
for _ in range(N):
graph.append(list(map(int,input().split())))
dq=deque([(0,0)])
while dq:
node = dq.popleft()
x,y=node[0],node[1]
visited[x][y]=True
#right nx,ny
rnx,rny=x,y+graph[x][y]
if (rnx,rny) == (N-1,N-1):
print('HaruHaru')
sys.exit()
if 0<=rny<N and not visited[rnx][rny]:
visited[rnx][rny] = True
if graph[rnx][rny] != 0:
dq.append((rnx,rny))
#down nx,ny
dnx,dny=x+graph[x][y],y
if (dnx,dny) == (N-1,N-1):
print('HaruHaru')
sys.exit()
if 0<=dnx<N and not visited[dnx][dny]:
visited[dnx][dny] = True
if graph[dnx][dny] != 0:
dq.append((dnx,dny))
print('Hing')
โ๏ธ ์ค๋ฅธ์ชฝ/์๋๋ก๋ง ์ด๋ ๊ฐ๋ฅํ์ง๋ง, ํ ๋ฒ ๋ฐฉ๋ฌธํ ๊ณณ์ ์ดํ ๊ฒฝ๋ก๊ฐ ๋๊ฐ์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ / ์ด ๋, graph ๊ฐ์ด 0์ผ๋ก ์ ํ ๊ฒฝ์ฐ ๋ ์ด์ ์งํํ ํ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ append()์ ๋ฃ์ง x
โ 11123 ์ ํ๋ง๋ฆฌ... ์ ๋๋ง๋ฆฌ... โ


from collections import deque
import sys
input=sys.stdin.readline
def BFS(graph, visited, start):
queue=deque([start])
visited[start[0]][start[1]]=True
dx,dy=[-1,1,0,0],[0,0,-1,1]
while queue:
v = queue.popleft()
for i in range(4):
nx,ny=v[0]+dx[i],v[1]+dy[i]
if 0<=nx<H and 0<=ny<W:
if not visited[nx][ny] and graph[nx][ny] == '#':
visited[nx][ny] = True
queue.append((nx,ny))
T=int(input())
for _ in range(T):
H,W=map(int,input().split())
grid=[]
visited=[[False]*W for _ in range(H)]
for _ in range(H):
grid.append(list(input().rstrip()))
sheeps=0
for i in range(H):
for j in range(W):
if not visited[i][j] and grid[i][j] == '#':
sheeps+=1
BFS(grid,visited,(i,j))
print(sheeps)
โ 5958 Space Exploration โ


from collections import deque
import sys
input=sys.stdin.readline
def BFS(graph,start):
visited[start[0]][start[1]] = True
queue=deque([start])
dx,dy=[-1,1,0,0],[0,0,-1,1]
while queue:
v=queue.popleft()
x,y=v[0],v[1]
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if 0<=nx<N and 0<=ny<N:
if not visited[nx][ny] and graph[nx][ny] == '*':
queue.append((nx,ny))
visited[nx][ny] = True
N=int(input())
graph=[]
for _ in range(N):
graph.append(list(input().rstrip()))
visited=[[False]*N for _ in range(N)]
ans=0
for i in range(N):
for j in range(N):
if not visited[i][j] and graph[i][j] == '*':
BFS(graph,(i,j))
ans+=1
print(ans)
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Stack & Queue & Deque Intermediate II - 3 Solvedโ (0) | 2024.05.26 |
---|---|
โ DP Intermediate II - 2 Solvedโ (0) | 2024.05.26 |
โ Two-Pointers Upper-Intermediate I - 6 Solvedโ (1) | 2024.02.11 |
โ Backtracking Upper-Intermediate I - 9 Solvedโ (0) | 2024.01.20 |
โ Backtracking Intermediate I - 10 Solvedโ (0) | 2024.01.18 |
๋๊ธ