BOJ/๐Ÿฅˆ

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜…

metamong 2024. 5. 12.

โ˜๏ธ ์ค‘์ƒ๊ธ‰์˜ BFS/DFS ์œ ํ˜•์€ ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ์š”์†Œ / ์—ฐ๊ฒฐ ์š”์†Œ ๋‚ด์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜ / ์ตœ๋‹จ ๊ฑฐ๋ฆฌ(Easy) 3๊ฐœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


โ˜… 11724 ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์œ ๊ธฐ๋† ๋ฐฐ์ถ” โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์„ฌ์˜ ๊ฐœ์ˆ˜ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ๊ทธ๋ฆผ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 1926 ๊ทธ๋ฆผ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์•ˆ์ „ ์˜์—ญ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 2468 ์•ˆ์ „ ์˜์—ญ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 2468 ์•ˆ์ „ ์˜์—ญ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์˜์—ญ ๊ตฌํ•˜๊ธฐ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 2583 ์˜์—ญ ๊ตฌํ•˜๊ธฐ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 2583 ์˜์—ญ ๊ตฌํ•˜๊ธฐ โ˜…

 

โ˜๏ธ BFS์—์„œ ์ƒํ•˜์ขŒ์šฐ ์–‘๋ฐฉํ–ฅ dx, dy ๋ฒกํ„ฐ ๋งŒ๋“ค๊ณ  for _ in range(4)๋ฌธ ๋Œ๋ ค nx์™€ ny ๋งŒ๋“  ๋‹ค์Œ nx์™€ ny ๋ฒ”์œ„์— ์žˆ๋Š” ์ง€ ํ™•์ธ์ด ์—ฌ๋Ÿฌ if๋ฌธ ์ž‘์„ฑ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐ.

 

โ˜๏ธ area์˜ ๊ฐœ์ˆ˜๋Š” ์—ฐ๊ฒฐ์š”์†Œ์˜ ๊ฐœ์ˆ˜: for๋ฌธ ์กฐ๊ฑด์— ๋งž์œผ๋ฉด +=1 / area ๋„“์ด๋Š” ์—ฐ๊ฒฐ์š”์†Œ๋งˆ๋‹ค ๊ธฐ์กด 1์—์„œ ๋„“ํž๋•Œ๋งˆ๋‹ค, ์ฆ‰ queue์— ๋“ค์–ด๊ฐˆ ์š”์†Œ๊ฐ€ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค +=1


โ˜… 14940 ์‰ฌ์šด ์ตœ๋‹จ๊ฑฐ๋ฆฌ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 14940 ์‰ฌ์šด ์ตœ๋‹จ๊ฑฐ๋ฆฌ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์Œ์‹๋ฌผ ํ”ผํ•˜๊ธฐ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 1743 ์Œ์‹๋ฌผ ํ”ผํ•˜๊ธฐ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์ „์Ÿ - ์ „ํˆฌ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 1303 ์ „์Ÿ - ์ „ํˆฌ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์–‘ โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 3184 ์–‘ โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ํšจ์œจ์ ์ธ ํ•ดํ‚น โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 1325 ํšจ์œจ์ ์ธ ํ•ดํ‚น โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 17086 ์•„๊ธฐ ์ƒ์–ด 2 โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ํ•„์š” ์—†์Œ.

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 17086 ์•„๊ธฐ ์ƒ์–ด 2 โ˜…

: ์œ„ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ ์ƒ์–ด(2ํ–‰)๋ฅผ ์ถœ๋ฐœ์ ์œผ๋กœ dist update ์ดํ›„ ๋‘๋ฒˆ์งธ ์ƒ์–ด(3ํ–‰)์„ ์ถœ๋ฐœ์ ์œผ๋กœ dist updateํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์˜ ์ˆซ์ž๊ฐ€ ํ˜„์žฌ ๋‘๋ฒˆ์งธ ์ƒ์–ด dist + 1 ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค. ์ฆ‰, ์ดํ›„ ์•„๋ฌด๋ฆฌ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•ด๋„ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๋œป(์–ด์ฐจํ”ผ ๋” ์ปค์ง€๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ๋งŒ ํ•  ๋ฟ. ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋ ค๋Š” ๋ฌธ์ œ์˜ ์˜๋„๊ฐ€ ์•„๋‹ˆ๋‹ค)

 

โ˜… visited[] ๋ฐฐ์—ด ์‚ฌ์šฉ ์—†์ด, update๋˜๋Š” dist๋กœ node๋ฅผ queue์˜ append ํ•  ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ๊ธฐ์–ตํ•˜๊ธฐ


โ˜… 16174 ์ ํ”„์™• ์ ค๋ฆฌ (Large) โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 16174 ์ ํ”„์™• ์ ค๋ฆฌ (Large) โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 ์–‘ ํ•œ๋งˆ๋ฆฌ... ์–‘ ๋‘๋งˆ๋ฆฌ... โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 11123 ์–‘ ํ•œ๋งˆ๋ฆฌ... ์–‘ ๋‘๋งˆ๋ฆฌ... โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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 โ˜…

โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 5958 Space Exploration โ˜…
โ˜…BFS&DFS Upper-Intermediate I - 16 Solvedโ˜… - undefined - undefined - โ˜… 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)

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€