๐โ๏ธ ๊ทธ๋ํ๋ก ํํ๋๋ ์ฌ๋ฌ ์ํฉ์์, ๊ฐ node์ visited ์ ๋ฌด๋ฅผ ๋ฐ์ง ๋ ๊ทธ๋ํ ํ์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ DFS / BFS๋ก ๋๋จ
๐โ๏ธ ๊น์ด์๊ฒ ๋จผ์ ํ์ํ์๋ฉด DFS / ๊ฐ๊น์ด ๊ฒ ๋จผ์ ํ์ํ์๋ฉด BFS
๐โ๏ธ DFS / BFS ๋ชจ๋ ๋ฑ! 3๊ฐ์ง์ ์ค๋น๋ฌผ ํ์
โป ์ด ๋ DFS๋ stack ์ฌ์ฉ / BFS๋ queue๋ฅผ ์ฌ์ฉํ๋ฏ๋ก BFS ์ฌ์ฉ ์ deque import โป
โ 2์ฐจ์ graph (๊ฐ node๋ณ๋ก ์ฐ๊ฒฐ๋ node์ ๋ฒํธ๊ฐ list๋ก ์ ์ฅ๋จ)
โก visited ์ฌ๋ถ 1์ฐจ์ list (์ต์ข ์ ์ผ๋ก ๋ฐฉ๋ฌธ๋์๋ ์ง ํ์ธ)
โข ์์ node
โ 1260 DFS์ BFS โ
import sys
input = sys.stdin.readline
from collections import deque
def DFS(graph,v,visited):
visited[v] = True
print(v, end = ' ')
for i in graph[v]:
if not visited[i]:
DFS(graph,i,visited)
def BFS(graph,start,visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v,end= ' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
N,M,V=map(int,input().split())
#graph ์ด๊ธฐํ
graph = [ [] for i in range(N+1)]
#graph ์์ฑ
for _ in range(M):
a,b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(N+1):
graph[i].sort()
visited=[False]*(N+1)
DFS(graph,V,visited)
print()
visited=[False]*(N+1)
BFS(graph,V,visited)
๐โ๏ธ ์ ํ์ ์ธ dfs/bfs ๋ฌธ์
๐โ๏ธ ๋ค๋ง, ๋ฐฉ๋ฌธ ์ ๋ฒํธ๊ฐ ํฐ node๋ถํฐ ๋จผ์ ๋ฐฉ๋ฌธํ๋ฏ๋ก ๋ง๋ graph๋ฅผ sortingํ ๋ค์ ํ์ ์์
โ 2606 ๋ฐ์ด๋ฌ์ค โ
import sys
input=sys.stdin.readline
def dfs(graph,n,visited):
visited[n] = True #visited
for i in graph[n]:
if not visited[i]:
dfs(graph,i,visited)
N=int(input())
graph=[[] for _ in range(N+1)]
for _ in range(int(input())):
a,b=map(int,input().split())
graph[a].append(b)
graph[b].append(a)
visited=[False]*(N+1)
dfs(graph,1,visited)
print(sum(visited)-1)
๐โ๏ธ ๋ฐ์ด๋ฌ์ค๊ฐ ํ ๋ฒ ๊ฐ์ผ๋๋ฉด, ์ธ์ ํ ๋ ธ๋๊น์ง ๋ชจ๋ ๊ฐ์ผ๋๋ฏ๋ก, ๊ฐ์ผ๋๋ ์ปดํจํฐ์ ๊ฐ์๋ฅผ ์ธ๋ ๋งค์ฐ ์ ํ์ ์ธ graph ๋ฌธ์
๐โ๏ธ ์ธ์ ํ ๋ถ๋ถ๊น์ง ๊ฐ์ผ๋๋, ๊ทธ๋ํ idea๋ฅผ ๋ ์ฌ๋ ค์ผ ํจ. BFS ์ ํ์ผ๋ก ํด๊ฒฐํ๋ค.
๐โ๏ธ ๋จผ์ 2์ฐจ์ ๊ทธ๋ํ ์ด๊ธฐํ ๋ค ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ , visited list์ ์์ ๋ ธ๋ 1๋ถํฐ dfs ํจ์๋ฅผ ๊ฑฐ์ณ update๋ visited์ True ๊ฐ์ ๋ฐํ (1 ์ ์ธ)
โ 24479 ์๊ณ ๋ฆฌ์ฆ ์์ - ๊น์ด ์ฐ์ ํ์ 1 โ
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**9)
global n
n = 0
def dfs(graph,start,orders):
global n
n+=1
orders[start]=n
for node in sorted(graph[start]):
if orders[node] == 0: #if not visited
dfs(graph,node,orders)
N,M,R=map(int,input().split())
#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)
#orders
orders=[0]*(N+1)
#dfs
dfs(graph,R,orders)
print(*orders[1:],sep='\n')
๐โ๏ธ ์ ํ์ ์ธ DFS ๋ฌธ์ ์ด๋, ํ ๋ ธ๋์์ ์ฌ๋ฌ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ ์์ ์๋ถํฐ ๋จผ์ ๋ฐฉ๋ฌธํด์ผ ํ๋ค๋ ๊ท์น์ด ์ถ๊ฐ๋ DFS
๐โ๏ธ ๋ฐ๋ผ์, pseudo-code์ ๋ง๊ฒ ๊ทธ๋๋ก for node in sorted(graph[start])๋ฅผ ์์
๐โ๏ธ dfs ์ธ ๊ฐ์ง ์ค๋น๋ฌผ
โ 2์ฐจ์ ๊ทธ๋ํ (์ ๋ฐฉํฅ๋ณ๋ก ๋ชจ๋ ์ค๋น - ๋ ๋ฒ append)
โก ์์ start R
โข ๊ฐ ๋ ธ๋ ๋ฒํธ๋ณ ๋ฐฉ๋ฌธ์์๋ฅผ ์ ์ฅํ 1์ฐจ์ list
๐โ๏ธ dfs()๋ฅผ ๋ค์ด๊ฐ๋ฉด
โ ๋จผ์ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก ๋ฐฉ๋ฌธํ์(์์ ์ ์ญ๋ณ์ n 1 ์ฆ๊ฐ / ๋ฐฉ๋ฌธ์์ list์ ์์ n ์ฝ์ )
โก ์ธ๊ทผ node๋ค sorted()ํ ์ํ์์ ๋ง์ฝ ๋ฐฉ๋ฌธ ์ํ์ผ๋ฉด, ์ฐจ๋ก๋๋ก dfs()
๐โ๏ธ ๊ฐ ๋ ธ๋๋ณ๋ก ๋ฐฉ๋ฌธ์์๋ฅผ ์์๋ด์ผ ํ๊ณ , ์ค๋ฆ์ฐจ์์ผ๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ ๊ท์น์ด ๋ค์ด๊ฐ ๋ณํ๋ dfs ์ ํ!
โ 24480 ์๊ณ ๋ฆฌ์ฆ ์์ - ๊น์ด ์ฐ์ ํ์ 2 โ
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**9)
global n
n = 0
def dfs(graph,start,orders):
global n
n+=1
orders[start]=n
for node in sorted(graph[start],reverse=True):
if orders[node] == 0: #if not visited
dfs(graph,node,orders)
N,M,R=map(int,input().split())
#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)
#orders
orders=[0]*(N+1)
#dfs
dfs(graph,R,orders)
print(*orders[1:],sep='\n')
๐โ๏ธ ์ 24479์ ์์ ๋๊ฐ์ ๋ฌธ์ . ๋ฐฉ๋ฌธ์์๋ง ๊ฑฐ๊พธ๋ก. reverse=True
โ 24444 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 1 โ
import sys
input=sys.stdin.readline
from collections import deque
def BFS(graph,visited,orders,start):
queue = deque([start])
visited[start] = True
order = 1
orders[start] = order
while queue:
next_node = queue.popleft()
for i in graph[next_node]:
if visited[i] == False:
order+=1
orders[i] = order
queue.append(i)
visited[i] = True
N,M,R=map(int,input().split())
graph=[[] for _ in range(N+1)]
visited=[False]*(N+1)
orders=[0]*(N+1)
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
for i in graph:
i.sort()
BFS(graph,visited,orders,R)
print(*orders[1:],sep='\n')
๐โ๏ธ ํฌ๊ฒ 2๊ฐ์ง๋ง ์ฃผ์ํ๋ฉด ๋๋ค!
(1) ๊ทธ๋ํ ๋ง๋ค ๋ ์ ์ด์ sort()๋ก ๋ ธ๋ ๋ฒํธ๊ฐ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
(2) ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ฏ๋ก ๋ณ๋์ orders[] ๋ฐฐ์ด ๋ง๋ค๊ณ ์ด๊ธฐ๊ฐ order๊ฐ 1์ฉ ์ฆ๊ฐํ๊ฒ๋ node๊ฐ ์ค์
๐โ๏ธ BFS ํจ์ ํ ๋ค์ ๋ณด๋ฉด
โ ๋จผ์ start node (1) visited ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + (2) queue ๋ง๋ค๊ณ ๋ฃ๊ธฐ
โก queue๊ฐ ์กด์ฌํ๋ ๋์ (1) popleft() ๊บผ๋ด๊ณ + (2) for๋ฌธ์ผ๋ก ๊ฐ๊ฐ์ node๋ฅผ ๋๋ ค ๋ฐฉ๋ฌธ ์ํ์ผ๋ฉด visited ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ + queue์ ๋ฃ๊ธฐ
โข ์ ๋ฌธ์ ๋ ํน์ ์ ์ผ๋ก ์ถ๊ฐ๋ก '๋ฐฉ๋ฌธ์์' ๋ฐฐ์ด์ ํ ๋ฒ ๋ ๋ฃ์ด์ ๋ฐฉ๋ฌธ์ํ์ผ๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ ๋ 1์ฉ ์ฆ๊ฐํ order๋ฅผ ๋ฃ๊ธฐ
โ 24445 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 2 โ
import sys
input=sys.stdin.readline
from collections import deque
def BFS(graph,visited,orders,start):
queue = deque([start])
visited[start] = True
order = 1
orders[start] = order
while queue:
next_node = queue.popleft()
for i in graph[next_node]:
if visited[i] == False:
order+=1
orders[i] = order
queue.append(i)
visited[i] = True
N,M,R=map(int,input().split())
graph=[[] for _ in range(N+1)]
visited=[False]*(N+1)
orders=[0]*(N+1)
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
for i in graph:
i.sort(reverse=True)
BFS(graph,visited,orders,R)
print(*orders[1:],sep='\n')
๐โ๏ธ ์ 24444๋ฒ ๋ฌธ์ ์ ๋๊ฐ๋ ๋ด๋ฆผ์ฐจ์ ๋ฌธ์ ์ด๋ค!
โ 24446 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 3 โ
import sys
input=sys.stdin.readline
from collections import deque
def BFS(graph,visited,depths,start):
queue = deque([start])
visited[start] = True
depths[start] = 0
while queue:
next_node = queue.popleft()
for i in graph[next_node]:
if visited[i] == False:
depths[i] = depths[next_node]+1
queue.append(i)
visited[i] = True
N,M,R=map(int,input().split())
graph=[[] for _ in range(N+1)]
visited=[False]*(N+1)
depths=[-1]*(N+1)
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
BFS(graph,visited,depths,R)
print(*depths[1:],sep='\n')
โ๏ธ ์ ํ์ ์ธ BFS ๋ฌธ์ ์์ BFS์ ๊น์ด๋ฅผ ์ถ๊ฐ๋ก ๊ตฌํ๋ ์ ํ!
โ๏ธ BFS์ ๊น์ด๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด BFS์์ ์๋ ์ฐ์ด๋ visited list ์ธ์ depths๋ผ๋ list๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉ!
โ๏ธ ์ ์ฝ๋ ์ผ๋ถ์์ next_node๋ก๋ถํฐ ๋์จ ์์ node์ธ i์ depth๋ ๋น์ฐํ ์ ๋ถ๋ชจ node์ ๊น์ด๋ณด๋ค 1ํฌ๋ฏ๋ก visited๊ฐ์ด False์ธ ๊ฒฝ์ฐ, ๋ฐฉ๋ฌธ ์นด์ดํธ๋๋ ๋ ธ๋์ ํํด์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ถ๋ชจ๋ ธ๋์ ๊น์ด๋ณด๋ค 1 ์ฆ๊ฐํ ๊ฐ์ ๊ธฐ์กด depths list์ ๋ฃ๋๋ค. (์ ํ ํ์ด ๋ฐ๋์ ๊ธฐ์ต!)
โ๏ธ ์ดํ ์ต์ข ์ ์ผ๋ก depth list ๊ฐ ์ถ๋ ฅํ๋ฉด ๋! ์ด ๋, list์ index๋ 0๋ถํฐ ์์ํ๋ฏ๋ก 1๋ฒ ๋ ธ๋๋ถํฐ์ด๊ธฐ์ index ํผ๋ ์กฐ์ฌ
โ 24447 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 4 โ
import sys
input=sys.stdin.readline
from collections import deque
def BFS(graph, visited, depths, orders, start):
#initialization (first node in a queue)
queue = deque([start])
visited[start] = True
depths[start] = 0
cur_order = 1
orders[start] = cur_order
while queue:
next_node = queue.popleft()
for child_node in graph[next_node]:
if visited[child_node] == False: #if not visited(child node)
visited[child_node] = True #visited
queue.append(child_node) #enqueue
depths[child_node] = depths[next_node] + 1
cur_order += 1
orders[child_node] = cur_order
N,M,R=map(int,input().split())
graph=[[] for _ in range(N+1)]
visited=[False]*(N+1)
depths=[-1]*(N+1)
orders=[0]*(N+1)
ans = 0
for _ in range(M):
u,v=map(int,input().split())
graph[u].append(v)
graph[v].append(u)
for nodes in graph:
nodes.sort()
BFS(graph, visited, depths, orders, R)
for d, t in zip(depths[1:], orders[1:]):
ans += (d*t)
print(ans)
โ๏ธ ๋๋น์ฐ์ ํ์์์์ ๋ ธ๋ ๋ฐฉ๋ฌธ ์์ + ๋ ธ๋ ๊น์ด ๋ ๊ฐ์ ๊ณฑํฉ์ ์ถ๋ ฅํ๋ ์ ํ!
โ 16953 A → B โ
import sys
input = sys.stdin.readline
from collections import deque
A,B=map(int,input().split())
queue=deque([A])
cnt=0
limit=1
bf=0
while queue:
cnt+=1
bf=0
for _ in range(limit):
n = queue.popleft()
if (n*2) == B:
print(cnt+1)
sys.exit()
elif int(str(n)+'1') == B:
print(cnt+1)
sys.exit()
else:
if (n*2)<B:
queue.append(n*2)
bf+=1
if (int(str(n)+'1'))<B:
queue.append(int(str(n)+'1'))
bf+=1
limit=bf
print(-1)
โ๏ธ BFS ์์ด๋์ด์์ ์์์ฐจ๋ฆฌ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค๋ ์ค์. ์ด ๋ ์ง์์ ์ผ๋ก *2 ๋๋ ๋ค์ 1์ ๋ถ์ธ ๊ฒฐ๊ณผ๊ฐ B๋ณด๋ค ํฌ๋ค๋ฉด queue์ ๋ฃ์ผ๋ฉด์ bf ๋ณ์ ๋์ ์ผ๋ก ๋ํด์ง๋ฉฐ limit update. (์ฆ B๋ณด๋ค ํฌ์ง ์๋ค๋ฉด enqueue ์ํ๊ณ bf count ์ ์ธ) limit์ ๋ค๋ค๋ฅด๋ฉด cnt+=1
โ๏ธ ๋์ค์ B ๋์ค๋ฉด cnt+1 (๋ฌธ์ ์ ์ต์๊ฐ + 1์ด๋ผ ํ์ผ๋ฏ๋ก) ์ถ๋ ฅํ๊ณ sys.exit()
โ๏ธ ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ฆ ๋ชจ๋ queue ๋ค ์งํ๋์ด๋ ์๋ค๋ฉด -1 ์ถ๋ ฅ
โ ํ์ง๋ง.....! BFS์ depth๋ก ํ๋ฒ์ ๊ตฌํ๋๊ฒ ์ ํธํจ โ๏ธ
โ 2644 ์ด์๊ณ์ฐ โ
import sys
input = sys.stdin.readline
from collections import deque
n=int(input())
graph=[[] for _ in range(n+1)]
def BFS(graph, visited, chon, start):
queue = deque([start])
visited[start] = True
while queue:
node = queue.popleft()
for v in graph[node]:
if not visited[v]:
chon[v] = chon[node] + 1
visited[v] = True
queue.append(v)
x,y=map(int,input().split())
m=int(input())
for _ in range(m):
a,b=map(int,input().split())
graph[a].append(b)
graph[b].append(a)
visited=[False]*(n+1)
chon=[0]*(n+1)
BFS(graph, visited, chon, x)
if chon[y] == 0:
print(-1)
else:
print(chon[y])
โ๏ธ x,y ์ค ํ ๋ช ์ ์์์ ์ผ๋ก ์ง์ ํ๊ณ ์ ์ฒด BFS์ depth๋ฅผ ๊ณ์ฐํ ๋ค, y์ depth ๊ฐ ๊ตฌํ๋ฉด ๋!
โ๏ธ BFS์ depth ๊ณ์ฐ ์ ํ - ํน์ node์ for๋ฌธ ๋๋ ค if not visited๋ผ๋ฉด ํน์ node depth์ +1(์ 24446 ๋ฌธ์ ์ฐธ๊ณ )
โ 21736 ํ๋ด๊ธฐ๋ ์น๊ตฌ๊ฐ ํ์ํด โ
import sys
input=sys.stdin.readline
from collections import deque
def bfs(graph,x,y):
queue=deque()
queue.append((x,y))
ans=0
while queue:
loc=queue.popleft()
x,y=loc[0],loc[1]
if 0<=(x-1):
if graph[x-1][y] == 'O':
graph[x-1][y] = 'X'
queue.append((x-1,y))
elif graph[x-1][y] == 'P':
ans+=1
graph[x-1][y] = 'X'
queue.append((x-1,y))
if (x+1)<=(N-1):
if graph[x+1][y] == 'O':
graph[x+1][y] = 'X'
queue.append((x+1,y))
elif graph[x+1][y] == 'P':
ans+=1
graph[x+1][y] = 'X'
queue.append((x+1,y))
if 0<=(y-1):
if graph[x][y-1] == 'O':
graph[x][y-1] = 'X'
queue.append((x,y-1))
elif graph[x][y-1] == 'P':
ans+=1
graph[x][y-1] = 'X'
queue.append((x,y-1))
if (y+1)<=(M-1):
if graph[x][y+1] == 'O':
graph[x][y+1] = 'X'
queue.append((x,y+1))
elif graph[x][y+1] == 'P':
ans+=1
graph[x][y+1] = 'X'
queue.append((x,y+1))
return ans
N,M=map(int,input().split())
campus=[]
x,y=0,0
for i in range(N):
line=list(input().rstrip())
if 'I' in line: x,y=i,line.index('I')
campus.append(line)
ppl = bfs(campus,x,y)
if ppl == 0: print('TT')
else: print(ppl)
โ๏ธ ์ ํ์ ์ธ BFS ์ ํ ๋ฌธ์ . ์์์ ์์ ์ ๋ฐฉํฅ ์ด๋์ ๋ด์ผ ํ๋ฏ๋ก BFS๋ก ๊ฐ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ค.
โ๏ธ ์ฃผ์์ - ๋ฌดํ ๋ฃจํ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก, ํ ๋ฒ ๋ฐฉ๋ฌธํ ๊ณณ์ X๋ก ์ฒ๋ฆฌํด ์ฌ๋ฐฉ๋ฌธ ๋ฐฉ์ง!
โ ํ ๊ณณ์์ ์ ๋ฐฉํฅ์ผ๋ก ํ์์ BFS ์ฌ์ฉ โ
โ 1697 ์จ๋ฐ๊ผญ์ง โ
import sys
input=sys.stdin.readline
from collections import deque
def BFS(graph, visited, depths, start):
visited[start] = True
depths[start] = 0
queue = deque([start])
while queue:
next_node = queue.popleft()
for child in [next_node-1, next_node+1, next_node*2]:
if child == K:
visited[child] = True
print(depths[next_node]+1)
return
elif 0 <= child <= 100_000 and not visited[child]:
visited[child] = True
queue.append(child)
depths[child] = depths[next_node] + 1
else:
pass
N,K=map(int,input().split())
if N==K:
print(0)
else:
graph=[[] for _ in range(K+1)]
visited=[False]*(100_000+1)
depths=[-1]*(100_000+1)
start = N
BFS(graph, visited, depths, start)
โ๏ธ ์ 16953 ๋ฌธ์ ์ ๋์ผ. BFS์ depth๋ก N์์ K๊น์ง ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
โ 7562 ๋์ดํธ์ ์ด๋ โ
import sys
input = sys.stdin.readline
from collections import deque
def BFS(graph, start, end, depth):
N=len(graph)
visited=[[0]*N for _ in range(N)]
queue=deque([start])
visited[start[0]][start[1]] = True
dx=[1,1,2,2,-1,-1,-2,-2]
dy=[2,-2,1,-1,2,-2,1,-1]
while queue:
v=queue.popleft()
for i in range(8):
nx,ny=v[0]+dx[i],v[1]+dy[i]
if 0<=nx<N and 0<=ny<N and not visited[nx][ny]:
visited[nx][ny] = True
queue.append((nx,ny))
depth[nx][ny] = depth[v[0]][v[1]]+1
if (nx,ny) == (end[0],end[1]):
return depth
for _ in range(int(input())):
I=int(input())
sx,sy=map(int,input().split())
gx,gy=map(int,input().split())
if (sx,sy) == (gx,gy):
print(0)
else:
graph=[[0]*I for _ in range(I)]
depth=[[0]*I for _ in range(I)]
print(BFS(graph,(sx,sy),(gx,gy),depth)[gx][gy])
โ๏ธ ์ถ๋ฐ์ ๊ณผ ๋์ฐฉ์ ์ด ์ฃผ์ด์ง ์ํ์์ ๊ฐ ์ ์๋ ์ต๋จ๊ฒฝ๋ก ๊ตฌํ๊ธฐ - BFS์ depth ์ ํ(์ 2644 ์ด์๊ณ์ฐ๊ณผ ๋์ผ)
โ๏ธ ์ถ๋ฐ์์ ๋์ฐฉ์ ๊น์ง ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก๋ BFS์ depth. ๋ฐ๋ผ์ graph์ธ์ depth graph ๋ง๋ค์ด์ not visited๋ผ๋ฉด ๊ธฐ์กด ์์ node depth + 1
โ 5014 ์คํํธ๋งํฌ โ
import sys
input = sys.stdin.readline
from collections import deque
F,S,G,U,D=map(int,input().split())
button=0
if S==G:
print(0)
else:
queue=deque([S])
visited=[0]*(F+1)
depth=[0]*(F+1)
dx=[U,-D]
while queue:
v=queue.popleft()
visited[v] = True
for i in range(2):
nv=v+dx[i]
if 1<=nv<=F and not visited[nv]:
visited[nv]=True
depth[nv]=depth[v]+1
queue.append(nv)
if depth[G]!=0:
print(depth[G])
else:
print('use the stairs')
โ๏ธ ์ผ์ฐจ์ ๋ฐฐ์ด์์ ์ ํด์ง ์์์ ๊ณผ ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ์ด๋ค. BFS idea + depths list ํ์ฉ
โ 2178 ๋ฏธ๋ก ํ์ โ
import sys
input=sys.stdin.readline
from collections import deque
N,M=map(int,input().split())
def bfs(maze,start,end):
queue = deque()
queue.append((start,end))
while queue:
v = queue.popleft()
x,y=v[0],v[1]
if 0<=(x-1):
if maze[x-1][y] == 1 and (x-1,y) != (0,0):
maze[x-1][y] = maze[x][y] + 1
queue.append((x-1,y))
if (x+1)<=(N-1):
if maze[x+1][y] == 1 and (x+1,y) != (0,0):
maze[x+1][y] = maze[x][y] + 1
queue.append((x+1,y))
if 0<=(y-1):
if maze[x][y-1] == 1 and (x,y-1) != (0,0):
maze[x][y-1] = maze[x][y] + 1
queue.append((x,y-1))
if (y+1)<=(M-1):
if maze[x][y+1] == 1 and (x,y+1) != (0,0):
maze[x][y+1] = maze[x][y] + 1
queue.append((x,y+1))
#graph
maze=[]
for _ in range(N):
maze.append(list(map(int,input().rstrip())))
#bfs
bfs(maze,0,0)
print(maze[-1][-1])
โ๏ธ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ฌป๋ ์ ํ์ ์ธ ๊ทธ๋ํ ๋ฌธ์ ์ ํ
โ๏ธ ์ต๋จ๊ฒฝ๋ก๋ ์ฃผ์ด์ง ํน์ ๋ ธ๋์์ ์ด๋ํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ ธ๋๋ฅผ ์ดํด๋ณด๊ณ , ๋ ธ๋๋ง๋ค ๊ทธ ๋ค์ ๋ ธ๋๋ก ์ด๋ํ ์ ์๋ค๋ฉด 1์ฉ ๊ณ์ ๋ ธ๋๊ฐ์ ๋ํด ์ต์ข ๋ง์ง๋ง [-1][-1]์ธ ์์๊ฐ ์ด๋ํ ์ ์๋ ์ต๋จ๊ฒฝ๋ก์ ์๋ฅผ ๋ปํ๋ค.
โ๏ธ ์ด ์ต๋จ๊ฒฝ๋ก ์ ํ์ ๋ฐ๋ผ์ BFS ์ ํ์ผ๋ก, ์ฃผ์ด์ง ๋ ธ๋์์ ์ด๋ํ ์ ์๋ ๋ชจ๋ ๋ฐฉํฅ์ ๋ ธ๋๋ค์ ์ดํด๋ณด์์ผ ํ๋ฏ๋ก, DFS ์ ํ์ ์ ํฉํ์ง ์๋ค. BFS๋ก ๋งค ๋ ธ๋ ๊ฐ์ ๊ณ์ ์ ๋ฐ์ดํธํ๋ฉด์ ๊ฒฝ๋ก๋ฅผ ์งํํด์ผ ํจ์ ๊ธฐ์ตํ์!
โ 16948 ๋ฐ์ค ๋์ดํธ โ
import sys
input=sys.stdin.readline
from collections import deque
N=int(input())
chess=[[0]*N for _ in range(N)]
r1,c1,r2,c2=map(int,input().split())
def BFS(graph, visited, depths, start, dest):
x,y=start[0],start[1]
visited[x][y] = True
depths[x][y] = 0
queue = deque([start])
while queue:
v = queue.popleft()
x,y=v[0],v[1]
for i in range(6):
nx,ny=x+dx[i],y+dy[i]
if 0<=nx<N and 0<=ny<N:
if visited[nx][ny] == False:
visited[nx][ny] = True
depths[nx][ny] = depths[x][y] + 1
if (nx,ny) == dest:
print(depths[nx][ny])
sys.exit()
queue.append((nx,ny))
start=(r1,c1)
dest=(r2,c2)
if start==dest:
print(0)
sys.exit()
visited=[[False]*N for _ in range(N)]
depths=[[-1]*N for _ in range(N)]
dx,dy=[-2,-2,0,0,2,2],[-1,1,-2,2,-1,1]
BFS(chess, visited, depths, start, dest)
print(-1)
โ๏ธ ๋ฐฉํฅ์ด ์ํ์ข์ฐ 4๋ฐฉํฅ์ด ์๋, 6๋ฐฉํฅ์ด๋ผ๋ ์ ๋ง ์ฃผ์! ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ค ๋ชฉ์ ์ง์ ๊ฐ๋ค๋ฉด ๊ทธ ์๋ฆฌ์์ depth ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ.
โ๏ธ ๊ฒฐ๊ตญ์ queue ๋๋ฆฌ๋ฉด์ ๋ชป์ฐพ์๋ค๋ฉด ํจ์ ๋ค ๋๋๊ณ ๋ ๋ค -1 ์ถ๋ ฅ
+ BFS ํจ์ ๋ด์ ๊ทธ๋ํ๊ฐ ๋ค์ด๊ฐ์ง ์์ผ๋ฏ๋ก visited๋ฅผ ์๋ง๋ค๊ณ graph ์์ฒด๋ฅผ ๋งํนํ๋ฉด์ 1๋ก ์ฐ์ผ๋ฉด์ visited ๊ธฐ์ค ๋ง๋ค์ด๋ ๋๋ค.
โ 16173 ์ ํ์ ์ ค๋ฆฌ (Small) โ
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]:
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]:
dq.append((dnx,dny))
print('Hing')
โ๏ธ ์ค๋ฅธ์ชฝ๊ณผ ์๋๋ก๋ง ์ฃผ์ด์ง graph[x][y]๋งํผ ์ด๋ํ๋ฉด ๋๋ค.
โ 25418 ์ ์ a๋ฅผ k๋ก ๋ง๋ค๊ธฐ โ
from collections import deque
A,K=map(int,input().split())
depth=[-1]*(K+1)
visited=[False]*(K+1)
depth[A]=0
visited[A]=True
queue = deque([A])
while queue:
v = queue.popleft()
for x in [v+1,2*v]:
if x <= K:
if not visited[x]:
visited[x]=K
if x == K:
print(depth[v]+1)
break
else:
depth[x]=depth[v]+1
queue.append(x)
โ๏ธ ์จ๋ฐ๊ผญ์ง ์ต๋จ๊ฒฝ๋ก์ ๋์ผ. depth๋ก ์ต๋จ๊ฒฝ๋ก depth ๊ตฌํด์ K ๋ง์ผ๋ฉด ๋ฐ๋ก ์ถ๋ ฅ
โ 21937 ์์ โ
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**7)
def dfs(graph,start,visited):
visited[start] = True
for x in graph[start]:
if not visited[x]:
dfs(graph,x,visited)
N,M=map(int,input().split())
graph=[[] for _ in range(N+1)]
visited=[False]*(N+1)
for _ in range(M):
A,B=map(int,input().split())
graph[B].append(A)
X = int(input())
dfs(graph,X,visited)
print(sum(visited)-1)
โ๏ธ ์์ X๋ฅผ ํ๊ธฐ ์ํด ํด์ผ ํ๋ ์์ ์ ์๋, ์์ X๋ฅผ ์์ ๋ ธ๋๋ก ์ค์ ํด ๊ทธ๋ํ ์ํํ ๊ฒฐ๊ณผ, visited์์ True node์ ๊ฐ์์ ๋์ผ. ๋ฐฉ๋ฌธ ๊ทธ๋ํ ๋ ธ๋์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ผ๋ ์ ๋ง ์บ์นํ๋ฉด ๋!
โ 11060 ์ ํ ์ ํ โ
import sys
input=sys.stdin.readline
from collections import deque
N=int(input())
A=list(map(int,input().split()))
queue = deque([0])
depths=[-1]*(N)
visited=[False]*(N)
visited[0] = True
depths[0] = 0
while queue:
v = queue.popleft()
d = [x for x in range(1,A[v]+1)]
for n in d:
nv = v + n
if 0 <= nv < N:
if not visited[nv]:
visited[nv] = True
depths[nv] = depths[v] + 1
queue.append(nv)
print(depths[-1])
โ๏ธ 1์ฐจ์ BFS๋ ๋ฐฉํฅ๋ฒกํฐ 1๋ถํฐ A[v]๊น์ง ์ฐจ๋ก๋๋ก ๊ตฌํ๋ฉด์ non visited์ผ ๋๋ง depths += 1 ์ ๋ฐ์ดํธ
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Divide & Conquer Upper-Intermediate I - 9 Solvedโ (0) | 2023.03.20 |
---|---|
โ Number Theory Upper-Intermediate I - 9 Solvedโ (0) | 2023.02.28 |
โ Combinatorics Intermediate I - 5 Solvedโ (1) | 2023.02.16 |
โ Set/Map Intermediate I - 14 Solvedโ (0) | 2023.02.15 |
โ Binary Search Upper-Intermediate I - 6 Solvedโ (0) | 2023.02.09 |
๋๊ธ