BOJ/๐Ÿฅˆ

โ˜…BFS&DFS Intermediate I - 17 Solvedโ˜…

metamong 2023. 2. 17.

 

 

DFS / BFS

โ‘  DFS(Depth-First Search) โšก๏ธ ๋จผ์ € DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ โšก๏ธ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ(๋˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ

sh-avid-learner.tistory.com

๐Ÿ™†‍โ™‚๏ธ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„๋˜๋Š” ์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ, ๊ฐ 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]๋งŒํผ ์ด๋™ํ•˜๋ฉด ๋œ๋‹ค.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€