BOJ/๐Ÿฅ‡

โ˜…BFS&DFS Advanced I - 10 Solvedโ˜…

metamong 2023. 12. 15.

โ˜… 7576 ํ† ๋งˆํ†  โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ) 

 

import sys
input=sys.stdin.readline
from collections import deque

M,N=map(int,input().split())
graph=[]
starts=[]
depths=[[0]*M for _ in range(N)]
visited=[[False]*M for _ in range(N)]

def BFS(graph, depths, starts, visited):
    queue = deque(starts)
    dx,dy=[0,0,-1,1],[-1,1,0,0]
    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 graph[nx][ny] == 0:
                    graph[nx][ny] = 1
                    visited[nx][ny] = True
                    depths[nx][ny] = depths[v[0]][v[1]] + 1
                    queue.append((nx,ny))

for x1 in range(N):
    l=list(map(int,input().split()))
    graph.append(l)
    x2=0
    for y in l:
        if y == 1:
            starts.append((x1,x2))
            visited[x1][x2] = True
        x2+=1

BFS(graph, depths, starts, visited)

for x in range(N):
    for y in range(M):
        if graph[x][y] == 0:
            print(-1)
            sys.exit()

max_depth=-10_000_000
for x in range(N):
    max_depth=max(max_depth,max(depths[x]))
print(max_depth)

 

โœด๏ธ ์ƒ์ž ๋‚ด์— ์ต์€ ํ† ๋งˆํ† ๋“ค์ด ๋™์‹œ์— ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฏ€๋กœ ์‹ค๋ฒ„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ธฐ์กด ๋ฌธ์ œ(์‹œ์ž‘์  1๊ฐœ)์˜ ๋‚œ์ด๋„ ์•ฝ๊ฐ„ ์ƒ์Šน. ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์œ ํ˜•: 1์ผ ๋•Œ์˜ (x,y)๋ฅผ starts list์— ๋„ฃ์–ด queue์— ๋„ฃ๊ณ  ์‹œ์ž‘

 

โœด๏ธ ๊ทธ ์™ธ) 0์ด ์žˆ๋‹ค๋ฉด -1 ์ถœ๋ ฅํ•˜๊ณ  ๋ฐ”๋กœ ์ข…๋ฃŒ / ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด max ๊ฐ’ 2์ฐจ์› ๋ฐฐ์—ด ๋Œ๋ ค์„œ ํ™•์ธ


โ˜… 7569 ํ† ๋งˆํ†  โ˜… (3์ฐจ์› ์ตœ๋‹จ๊ฒฝ๋กœ) 

 

import sys
input=sys.stdin.readline
from collections import deque

def BFS(graph, visited, depths, starts):
    queue = deque(starts)
    dx,dy,dz=[0,0,0,0,1,-1],[0,0,1,-1,0,0],[1,-1,0,0,0,0]
    while queue:
        v = queue.popleft()
        x,y,z=v[0],v[1],v[2]
        visited[x][y][z] = True
        for i in range(6):
            nx,ny,nz=x+dx[i],y+dy[i],z+dz[i]
            if 0<=nx<H and 0<=ny<N and 0<=nz<M:
                if visited[nx][ny][nz] == False and graph[nx][ny][nz] == 0:
                    queue.append((nx,ny,nz))
                    depths[nx][ny][nz] = depths[x][y][z] + 1
                    graph[nx][ny][nz] = 1 #riped

M,N,H=map(int,input().split())
graph=[[] for _ in range(H)]
starts=[]
for i in range(H):
    for j in range(N):
        l = list(map(int,input().split()))
        graph[i].append(l)
        for k in range(len(l)):
            if l[k] == 1:
                starts.append((i,j,k))

visited=[[[False]*M for _ in range(N)] for _ in range(H)]
depths=[[[0]*M for _ in range(N)] for _ in range(H)]

BFS(graph, visited, depths, starts)

for h in range(H):
    for x in range(N):
        for y in range(M):
            if graph[h][x][y] == 0:
                print(-1) #not all has ripened
                sys.exit()

max_depth=-2
for h in range(H):
    for x in range(N):
        max_depth=max(max_depth,max(depths[h][x]))
print(max_depth)

 

โœด๏ธ ๋†’์ด ๋ถ€๋ถ„ ์ƒ/ํ•˜ ๋ฐฉํ–ฅ์œผ๋กœ๋„ ์Œ“์•„์•ผ ํ•œ๋‹ค๋Š” ์ ๋งŒ ์ฃผ์˜! ๋ฐฉํ–ฅ ๋ฒกํ„ฐ dx, dy = [0,0,0,0,-1,1], [0,0,-1,1,0,0], [-1,1,0,0,0,0] ์ด๋ ‡๊ฒŒ ์ด 6๊ฐ€์ง€์˜ ๋ฐฉํ–ฅ๋ฒกํ„ฐ ์กด์žฌ

 

โœด๏ธ ์‹œ์ž‘์  ๋™์‹œ์— ์ง„ํ–‰ / depths BFS ์ตœ๋Œ“๊ฐ’ / ๊ทธ ์™ธ ๋ฌธ์ œ์— ๋งž๊ฒŒ ์ง„ํ–‰ (์ฆ‰ ๋‚˜๋จธ์ง€๋Š” ์œ„์˜ 7569 ํ† ๋งˆํ†  ๋ฌธ์ œ ํ’€์ด์™€ ๋™์ผ)


โ˜… 14502 ์—ฐ๊ตฌ์†Œ โ˜… (์—ฐ๊ฒฐ๋…ธ๋“œ)

 

import sys, copy
input=sys.stdin.readline
from collections import deque
from itertools import combinations

N,M=map(int,input().split())
graph_init=[]
virus=[]
pos=[]

def get_zero(graph, N, M, pos):
    for i in range(N):
        for j in range(M):
            if graph[i][j] == 0:
                pos.append((i,j))
    return pos

def BFS(graph, virus, N, M, visited):
    queue=deque(virus)
    for v in virus:
        visited[v[0]][v[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 graph[nx][ny]==0:
                    visited[nx][ny]=True
                    graph[nx][ny] = 2
                    queue.append((nx,ny))

for x in range(N):
    l,y=list(map(int,input().split())),0
    graph_init.append(l)
    for i in l:
        if i == 2:
            virus.append((x,y))
        y+=1
pos=get_zero(graph_init,N,M,pos) #to find the potential spots to install a wall
ans=0

for pos_pair in combinations(pos,3):
    graph=copy.deepcopy(graph_init)
    for (x,y) in pos_pair:
        graph[x][y] = 1 #make a wall
    visited=[[False]*M for _ in range(N)]
    BFS(graph, virus, N, M, visited) #make virus spread
    areas=0
    for i in range(N):
        for j in range(M):
            if graph[i][j] == 0:
                areas+=1
    ans=max(ans,areas)
print(ans)

 

โœด๏ธ

(1) ๋ฒฝ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” 0 ์œ„์น˜ pos list์— ๋ชจ์œผ๊ธฐ

(2) virus ์œ„์น˜ ๋ชจ์œผ๊ธฐ

(3) combinations(pos,3) ๋Œ๋ฆด ๋•Œ๋งˆ๋‹ค brute-force๋กœ ๋งค case ์•ˆ์ „์˜์—ญ์˜ ํฌ๊ธฐ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ deepcopy() ๊ณ„์† ์‚ฌ์šฉ → ์„ธ ๊ตฐ๋ฐ ๋ฒฝ ์„ธ์šฐ๊ณ (1๋กœ ๋งŒ๋“ค๊ธฐ) → ์—ฌ๋Ÿฌ virus ๋™์‹œ์— ํผ์ง€๊ฒŒ BFS ๋Œ๋ฆฌ๊ธฐ → 0์ธ ๊ฐœ์ˆ˜ areas๋กœ ๊ตฌํ•ด์„œ ans update


โ˜… 10026 ์ ๋ก์ƒ‰์•ฝ โ˜… (์—ฐ๊ฒฐ๋…ธ๋“œ)

 

import sys, copy
input=sys.stdin.readline
from collections import deque

N=int(input())
arr=[]
ans1,ans2=0,0

def BFS1(arr,visited,N,color,start):
    queue=deque([start])
    dx,dy=[0,0,1,-1],[1,-1,0,0]
    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<N:
                if visited[nx][ny] == False and arr[nx][ny] == color:
                    visited[nx][ny]=True
                    queue.append((nx,ny))

def BFS2(arr,visited,N,color,start):
    queue=deque([start])
    dx,dy=[0,0,1,-1],[1,-1,0,0]
    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<N:
                if visited[nx][ny] == False:
                    if color=='B':
                        if arr[nx][ny] == 'B':
                            visited[nx][ny]=True
                            queue.append((nx,ny))
                    else: #'R''G'
                        if arr[nx][ny] in ['R','G']:
                            visited[nx][ny]=True
                            queue.append((nx,ny))

for _ in range(N):
    arr.append(list(input().rstrip()))
visited1=[[False]*N for _ in range(N)]
visited2=[[False]*N for _ in range(N)]

for i in range(N):
    for j in range(N):
        color=arr[i][j]
        if not visited1[i][j]:
            visited1[i][j] = True
            BFS1(arr,visited1,N,color,(i,j))
            ans1+=1
        if not visited2[i][j]:
            visited2[i][j] = True
            BFS2(arr,visited2,N,color,(i,j))
            ans2+=1


print(ans1,ans2)

 

โœด๏ธ ์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐ์˜์—ญ์˜ ๊ฐœ์ˆ˜ + ์ ๋ก์ƒ‰์•ฝ์ผ ๊ฒฝ์šฐ R/G/B if๋ฌธ ๊ตฌ๋ถ„๋งŒ ํ•ด์ฃผ๋ฉด ๋จ


โ˜… 1240 ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ โ˜… (๋…ธ๋“œ ๊ฑฐ๋ฆฌ)

 

import sys
input=sys.stdin.readline
from collections import deque

def BFS(tree, visited, x, y, d):
    visited[x]=True
    queue=deque([(x,0)])
    while queue:
        v,d=queue.popleft()
        if v == y:
            return d
        for sub_v in tree[v]:
            if not visited[sub_v[0]]:
                visited[sub_v[0]]=True
                queue.append((sub_v[0],sub_v[1]+d))

N,M=map(int,input().split())
tree=[[] for _ in range(N+1)]
for _ in range(N-1):
    a,b,d=map(int,input().split())
    tree[a].append((b,d))
    tree[b].append((a,d))
for _ in range(M):
    x,y=map(int,input().split())
    visited=[False]*(N+1)
    print(BFS(tree,visited,x,y,0))

 

โœด๏ธ BFS์˜ depth ๊ตฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜๊ฒŒ BFS์˜ ์ฃผ์–ด์ง„ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” ๊ณ„์† updateํ•˜๋ฉด์„œ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

โœด๏ธ ์ฃผ์–ด์ง„ node์˜ (x,0) tuple์„ queue๋กœ ๋Œ๋ฆฌ๊ณ ((node ๋ฒˆํ˜ธ, ์ฃผ์–ด์ง„ node์—์„œ ํ•ด๋‹น node ๋ฒˆํ˜ธ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ)๊ฐ€ tuple ํ˜•ํƒœ), ์›ํ•˜๋Š” ๋…ธ๋“œ์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด(v==y) ๋ฐ”๋กœ d ์ถœ๋ ฅ

 

โ€ป BFS ์‚ฌ์šฉ ํ•„์š”! BFS๋ฉด ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์œผ๋กœ ๋ป—์น˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ node์— ์›๋ž˜ node๋กœ๋ถ€ํ„ฐ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ(์ฆ‰, ๊ฐ„์„  ๊ฐ€์ค‘์น˜์˜ ํ•ฉ)์ด ์ €์žฅ๋˜๋ฏ€๋กœ, queue๋กœ๋งŒ ์ด๋™์‹œํ‚จ๋‹ค๋ฉด ์ตœ์ข… node์™€ ๊ฐ™์„ ๋•Œ์˜ tuple ๋‘๋ฒˆ์งธ ์š”์†Œ ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋! (์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ณ€ํ˜•๋ฌธ์ œ)

 

โœด๏ธ <์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ ๋‹ค๋ฅธ ์ > queue์— ๋Œ์•„๊ฐ€๋Š” ์ •๋ณด๊ฐ€ ๋‘ ๊ฐœ + BFS์ด๋ฏ€๋กœ ์‹œ์ž‘ node์—์„œ ์‹œ์ž‘๋˜๋Š” ๊ฑฐ๋ฆฌ ๋ˆ„์ (d)


โ˜… 13913 ์ˆจ๋ฐ”๊ผญ์งˆ 4 โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ + ๊ฒฝ๋กœ ๋‚ด์šฉ ์ถ”์ )

 

import sys
input=sys.stdin.readline
from collections import deque
N,K=map(int,input().split())
def BFS(visited, depths, start):
    visited[start] = True
    depths[start] = 0
    path[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)
                path[child] = next_node
                return
            elif 0 <= child <= 100_000 and not visited[child]:
                visited[child] = True
                queue.append(child)
                depths[child] = depths[next_node] + 1
                path[child] = next_node
            else:
                pass

if N==K:
    print(0)
    print(K)
else:
    visited=[False]*(100_000+1)
    depths=[-1]*(100_000+1)
    path=[-1]*(100_000+1)
    start = N
    ans=[K]
    ind=K
    BFS(visited, depths, start)
    while path[ind]!=N:
        ans.append(path[ind])
        ind=path[ind]
    ans.append(N)
    print(*ans[::-1])

 

โœด๏ธ ๊ฐ€์ค‘์น˜ ์šฐ์„ ์ˆœ์œ„ ์—†๋Š” BFS์˜ ์ผ๋ฐ˜์ ์ธ ์ตœ๋‹จ๊ฒฝ๋กœ ์ถœ๋ ฅ์€ ์‹ค๋ฒ„1 <1697 ์ˆจ๋ฐ”๊ผญ์งˆ> ๋ฌธ์ œ. ์—ฌ๊ธฐ์„œ ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๋ชจ๋“ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ ์ถœ๋ ฅ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€

 

โœด๏ธ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์ฐธ์กฐํ•˜๋“ฏ, ์ž์‹ node๋ฅผ index๋กœํ•˜๊ณ  ํ•ด๋‹น ์ž์‹ node์˜ list value๋กœ ๋ถ€๋ชจ node๋ฅผ ์ €์žฅ. ๊ทธ๋Ÿฌ๋ฉด ๋„์ฐฉ ๋…ธ๋“œ K index๋ถ€ํ„ฐ ์—ญ์œผ๋กœ N index ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋Š” idea

: queue์— node๊ฐ€ ๋“ค์–ด๊ฐˆ ๋•Œ ๋งˆ๋‹ค path[child] = next_node๋กœ path update. ์˜ˆ๋ฅผ ๋“ค์–ด 5์—์„œ 17๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ ๋‚ด์šฉ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฑฐ๊พธ๋กœ index 17๋ถ€ํ„ฐ index 5๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์—ญ์ถ”์  ๊ฒฝ๋กœ ์ €์žฅํ•ด ์ถœ๋ ฅ


โ˜… 13549 ์ˆจ๋ฐ”๊ผญ์งˆ 3 โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ)

 

import sys
input = sys.stdin.readline
from collections import deque

N,K=map(int,input().split())
depths=[-1]*(100_001)
visited=[False]*(100_001)

def BFS(depths, visited, N):
  queue = deque([N])
  visited[N] = True
  depths[N] = 0

  while queue:
    v = queue.popleft()

    if (2*v)<=100_000 and not visited[2*v]:
      visited[2*v] = True
      queue.append(2*v)
      depths[2*v] = depths[v]
      if (v*2) == K:
        return

    if 0<=(v-1) and not visited[(v-1)]:
      visited[v-1] = True
      queue.append(v-1)
      depths[v-1] = depths[v] + 1
      if (v-1) == K:
        return
  
    if (v+1)<=100_000 and not visited[(v+1)]:
      visited[v+1] = True
      queue.append(v+1)
      depths[v+1] = depths[v] + 1
      if (v+1) == K:
        return

    
  

if N==K:
  print(0)
else:
  BFS(depths, visited, N)
  print(depths[K])

 

โœด๏ธ ์‹ค๋ฒ„1 1697 ์ˆจ๋ฐ”๊ผญ์งˆ ๋ฌธ์ œ์™€ ์œ ์‚ฌ

 

→ ํ•˜์ง€๋งŒ ์œ„ ๋ฌธ์ œ๋Š” 0์ดˆ ํ›„์— 2*X๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ์ . ์ฆ‰ X-1์ด๋‚˜ X+1 ์ด๋™๋ณด๋‹ค 2*X๋ฅผ ๋จผ์ € ๊ณ ๋ ค(๊ฐ€์ค‘์น˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” BFS ๋ณ€ํ˜•)ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ v*2๊ฐ€ K์ธ์ง€ ์•„๋‹Œ ์ง€๋ฅผ ๋‹ค๋ฅธ ์ผ€์ด์Šค X-1 / X+1 ์ด๋™๋ณด๋‹ค ๋จผ์ € ๋”ฐ์ ธ์•ผ ํ•จ. queue์—์„œ ๊ฐ€์žฅ ๋จผ์ € 2*X๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๊ธฐํ•ด์•ผ ํ›„์ˆœ์œ„์ธ X-1์ด๋‚˜ X+1๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๋‚˜์˜จ ์ตœ๋‹จ์‹œ๊ฐ„๋ณด๋‹ค ๋” ์ตœ๋‹จ์‹œ๊ฐ„์ด ๋‚˜์™€๋„ ๋จผ์ € ์žก์•„์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ


โ˜… 16928 ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ ๊ฒŒ์ž„ โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ + ๋ณ€ํ˜•)

 

import sys
input=sys.stdin.readline
from collections import deque

N,M=map(int,input().split())
depths=[-1]*101
visited=[False]*101
d=[1,2,3,4,5,6]
snake_ladder=dict() #no snake/ladder exists in 1 and 100

def BFS(depths, visited, start):
    visited[start] = True
    depths[start] = 0
    queue=deque([start])
    while queue:
        v = queue.popleft()
        for i in range(6):
            nx=v+d[i]
            if nx<=100 and not visited[nx]:
                depths[nx] = depths[v] + 1
                visited[nx] = True
                if nx==100: #arrived at destination   
                    return
                if nx not in snake_ladder.keys(): # not arrived in snake / ladder
                    queue.append(nx)
                else: #arrived in snake/ladder
                    after=snake_ladder[nx]
                    if not visited[after]:
                        visited[after] = True 
                        depths[after] = depths[nx]
                        queue.append(after)

for _ in range(N):
    x,y=map(int,input().split())
    snake_ladder[x]=y
for _ in range(M):
    u,v=map(int,input().split())
    snake_ladder[u]=v

BFS(depths,visited,1)

print(depths[100])

 

โœด๏ธ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ BFS depth ์ „ํ˜•์ ์ธ ์œ ํ˜•์—, ๋ฑ€๊ณผ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋‹ค๋ฅธ node์—์„œ ๋‹ค๋ฅธ node๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ๋งŒ ์ถ”๊ฐ€๋จ

 

โœด๏ธ dict()๋ฅผ ๋งŒ๋“ค์–ด snake๋‚˜ ladder์ผ ๊ฒฝ์šฐ ์ดํ›„ ์ด๋™๋˜๋Š” node๊ฐ€ not visited์ผ ๊ฒฝ์šฐ depth ๋ณ€ํ™” ์—†์ด ํ• ๋‹น / ์ดํ›„ ์ด๋™๋˜๋Š” node ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ / queue์— ์ดํ›„ ์ด๋™๋˜๋Š” node ๋„ฃ๊ธฐ 3๊ฐœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฐ”๋กœ ๋!

 

โ˜… BFS์ด๊ณ  ์‹œ์ž‘์ ์ด ์ •ํ•ด์ ธ์žˆ์œผ๋ฏ€๋กœ ๋„์ฐฉ์ ์„ ํ–ฅํ•ด ๋™์‹œ์— ๋ฐฉํ–ฅ์ด ์žˆ๋Š” ์ƒํƒœ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์ค‘์— ๋ฑ€์ด๋‚˜ ์‚ฌ๋‹ค๋ฆฌ๋กœ node๋ฅผ ์ด๋™ํ•ด๋„ visited ์ฒ˜๋ฆฌ๋งŒ ์ž˜ ํ•œ๋‹ค๋ฉด ๋์ ๊นŒ์ง€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ BFS depth๋กœ ๋ฐ”๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


โ˜… 9019 DSLR โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ + ๋ณ€ํ˜•)

 

import sys
input=sys.stdin.readline
from collections import deque

def BFS(visited,start,end):
    visited[start[0]]=True
    queue=deque([start])
    while queue:
        v=queue.popleft()
        #D
        D=(2*v[0])%10000
        #S
        S=(v[0]-1) if (v[0]-1)>=0 else 9999
        #L
        l=str(v[0]).zfill(4)
        L=int(l[1]+l[2]+l[3]+l[0])
        #R
        r=str(v[0]).zfill(4)
        R=int(r[3]+r[0]+r[1]+r[2])

        DSLR=[D,S,L,R]

        for nv in range(len(DSLR)):
            if not visited[DSLR[nv]]:
                visited[DSLR[nv]]=True
                if DSLR[nv] == end: #if answer found
                    return v[1]+['DSLR'[nv]]
                queue.append([DSLR[nv],v[1]+['DSLR'[nv]]])


for _ in range(int(input())):
    A,B=map(int,input().split())
    visited=[False]*(10_000)
    depths=[-1]*(10_000)

    print(*BFS(visited,[A,[]],B),sep='')

 

โœด๏ธ ์œ„ BOJ 1240 ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ queue์— ๋„ฃ์„ ๋•Œ, ๋…ธ๋“œ ๋ฒˆํ˜ธ + ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€์˜ DSLR ์กฐํ•ฉ ๋ช…๋ น์–ด๋ฅผ ๋„ฃ๋Š”๋‹ค๋Š” BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์‘์šฉ๋ฌธ์ œ. BFS traversingํ•˜๋ฉด์„œ ๋‘ ๋ฒˆ์งธ ์ •๋ณด ๋ฌธ์ž์—ด์ด ๊ณ„์† ๋”ํ•ด์ง๋งŒ ๋ณด๋ฉด ๋จ. queue์— ๋‘ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ์„ ์ธ์ง€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด OK!


โ˜… 1963 ์†Œ์ˆ˜ ๊ฒฝ๋กœ โ˜… (์ตœ๋‹จ๊ฒฝ๋กœ + ์†Œ์ˆ˜ ํŒ์ •) 

 

import sys
input=sys.stdin.readline
from collections import deque

def BFS(start,end):
    dq=deque([(start,0)])
    while dq:
        n,depth=dq.popleft()
        if not visited[n]:
            visited[n] = True
            for i in range(4):
                for j in range(10):
                    if i == 0:
                        if j != 0:
                            next_n = int(str(j)+str(n)[1:])
                        else: continue
                    else:
                        next_n = int(str(n)[:i]+str(j)+str(n)[i+1:])
                    if next_n == end:
                            return depth + 1
                    else:
                        if not visited[next_n] and sieve[next_n]:
                            dq.append((next_n,depth+1))
    return 'Impossible'


#sieve ~9999
sieve = [True]*(10001)
sieve[0],sieve[1]=False,False

for i in range(2,10001):
    if sieve[i] == True:
        for j in range(i,10001,i):
            sieve[j] = False
        sieve[i] = True


for _ in range(int(input())):
    x,y=map(int,input().split())
    visited=[False]*10001
    if x == y:
        print(0)
    else:
        print(BFS(x,y))

 

โœด๏ธ x → y๋กœ ๊ฐ€๋Š” ์†Œ์ˆ˜์˜ ๊ฒฝ๋กœ๋ฅผ BFS๋กœ ์ฐพ๋Š”๋‹ค. x์˜ ๊ฐ ์ž๋ฆฌ๋ฅผ brute-force๋กœ 0๋ถ€ํ„ฐ 9๊นŒ์ง€ ๋ฐ”๊พธ๋ฉฐ(์ฒซ ์ž๋ฆฌ๋งŒ 0 ์ œ์™ธ) ๋งŒ๋“  next_n์ด ์†Œ์ˆ˜์— ํ•ด๋‹น๋˜๊ณ  not visited๋ผ๋ฉด BFS deque์— (next_n, depth + 1) append. (๋„ค ์ž๋ฆฌ๊นŒ์ง€ ์†Œ์ˆ˜ sieve ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค ์ฒด๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ)

 

โ€ป ์ด ๋•Œ not visited ์ ๊ฒ€ ์ด์œ ๋Š”, ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ•œ ์ˆซ์ž์˜ depth๊ฐ€ ํ˜„์žฌ depth๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฏ€๋กœ ํ•ด๋‹น next_n ์ดํ›„๋ฅผ ์ ๊ฒ€ํ•  ํ•„์š” x


  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'BOJ > ๐Ÿฅ‡' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

โ˜…Coordinate Compression Advanced - 2 Solvedโ˜…  (0) 2023.12.28
โ˜…Tree Advanced I - 1 Solvedโ˜…  (1) 2023.12.22
โ˜…Greedy Upper-Advanced I - 1 Solvedโ˜…  (1) 2023.10.18
โ˜…BF Advanced I - 3 Solvedโ˜…  (0) 2023.10.06
โ˜…Greedy Advanced I - 4 Solvedโ˜…  (0) 2023.08.30

๋Œ“๊ธ€