S,E,X,L,O 로 이루어진 2차원 배열
S ➡️ L ➡️ E 의 최단 거리
No weight 그래프에서의 최단 거리
를 묻는 것이므로 BFS로 쉽게 풀 수 있다. 단순히 두 번 돌려주면 됨!
def find(maps):
start,end,lever = (0,0),(0,0),(0,0)
for i in range(r):
for j in range(c):
if maps[i][j] == 'S':
start = (i,j)
if maps[i][j] == 'E':
end = (i,j)
if maps[i][j] == 'L':
lever = (i,j)
return start,end,lever
시작,레버,도착 위치를 찾아주는 함수
def solution(maps):
global r,c
answer = 0
r,c = len(maps), len(maps[0])
for i in range(r):
maps[i] = list(maps[i])
start,end,lever = find(maps) # start node
sx,sy = start
lx,ly = lever
ex,ey = end
answer += bfs(sx,sy,lx,ly,maps)
answer += bfs(lx,ly,ex,ey,maps)
if answer < 0:
return -1
return answer
find 함수를 통해 시작,레버,도착 위치 겟
시작 --> 레버
레버 --> 도착
거리를 answer
에 갱신
def bfs(sx,sy,ex,ey,maps): # start(x,y) , end(x,y)
q = deque([(sx,sy,0)])
visited = [[False]*c for _ in range(r)]
visited[sx][sy] = True
dx = [1,-1,0,0]
dy = [0,0,1,-1]
while q:
x,y,cnt = q.popleft()
if (x,y) == (ex,ey):
return cnt
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<r and 0<=ny<c and not visited[nx][ny] and maps[nx][ny] != 'X':
q.append((nx,ny,cnt+1))
visited[nx][ny] = True
return -int(1e9)
일반적인 BFS 골격에 목적지에 도달할 수 없는 경우를 추가했다.
"""
#1. BFS
#2.
maps --BFS--> lever_time
maps --BFS--> end_time
lever_time,end_time --sum--> answer
"""
from collections import deque
def find(maps):
start,end,lever = (0,0),(0,0),(0,0)
for i in range(r):
for j in range(c):
if maps[i][j] == 'S':
start = (i,j)
if maps[i][j] == 'E':
end = (i,j)
if maps[i][j] == 'L':
lever = (i,j)
return start,end,lever
def bfs(sx,sy,ex,ey,maps): # start(x,y) , end(x,y)
q = deque([(sx,sy,0)])
visited = [[False]*c for _ in range(r)]
visited[sx][sy] = True
dx = [1,-1,0,0]
dy = [0,0,1,-1]
while q:
x,y,cnt = q.popleft()
if (x,y) == (ex,ey):
return cnt
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<r and 0<=ny<c and not visited[nx][ny] and maps[nx][ny] != 'X':
q.append((nx,ny,cnt+1))
visited[nx][ny] = True
return -int(1e9)
def solution(maps):
global r,c
answer = 0
r,c = len(maps), len(maps[0])
for i in range(r):
maps[i] = list(maps[i])
start,end,lever = find(maps) # start node
sx,sy = start
lx,ly = lever
ex,ey = end
answer += bfs(sx,sy,lx,ly,maps)
answer += bfs(lx,ly,ex,ey,maps)
if answer < 0:
return -1
return answer