: 왼쪽 최하단 좌표에서 우측 최상단 좌표로 이동하는 경우에 최단거리로 가는 거리가 얼마나 되는지를 구하는 문제이다. 0,1 로 이뤄진 좌표에서 1은 지날 수 없는 부분이고, 0만 지날 수 있다. n*m의 크기를 가졌는데, n,m 각각 1보다 같거나 크고, 천보다 작거나 같다.
: 일단 이 문제에서의 포인트는 특정 좌표에서 특정 좌표로 '최단거리'로 가는 케이스를 찾아내야한다는 것이다. 또한, 최단거리로 가면서 마주치는 장애물(1)을 피해가면서 가는 케이스를 잘 찾아내야한다. 즉, x에서 y로 가는 최단거리는 사실 정해져있겠지만, 그 안에 장애물들이 있기 때문에 실제로 탐색을 해봐야 알 수 있는 것이다. 그러면 최단 거리를 구하려면 어떤 해결책을 찾아야할까? 를 생각해보면, 일단 이 맵자체가 그래프 형태로 표현됨을 알아야한다. 그리고 이러한 그래프를 탐색할 때 DFS, BFS를 떠올릴 수 있어야하고, 그중에 DFS로는 이번 문제를 풀 수 없다는 걸 알아야할 것 같다. BFS로 풀어야지만, 한칸한칸 전진하면서 최단거리로 거리를 측정하며 거리를 잴 수 있다. DFS로 하면 완전히 돌아가는 길도 서슴없이(?) 탐색을 하게 될 것이다. 하나의 길이 아닌 여러개의 갈림길이 있는 길을 탐색하면서 동시에 최단거리를 찾으려면, 모든 갈림길을 한번에 한걸음씩 걸어보면서 측정하다가, 마지막에 도착지점에서 이길이 최단거리로 가는 길이구나 알 수 있는데, 그것을 가능하게 해주는 것이 BFS!
import copy
n,m = map(int,input().split())
board = []
for i in range(n):
board.append([1]+list(map(int, input().split()))+[1])
limit_line = [[1 for i in range(m+2)]]
board = limit_line + board + limit_line
root = (n,1) # (n-1,0)이 아닌 이유는 경계처리를 해줬기 때문!
path = {} # 거리 정보를 담을 dictionary
path[root] = 0
# root의 거리정보를 담을 필요는 없지만, 이미 들른 곳이라는 것을 표시하기 위함
queue = [root]
copy_board = copy.deepcopy(board)
while len(queue) != 0:
top = queue.pop(0)
up = (top[0]-1,top[1])
right = (top[0],top[1]+1)
down = (top[0]+1,top[1])
left = (top[0],top[1]-1)
next_arr = []
for el in [up,right,down,left] :
prev_len = path[top]
if copy_board[el[0]][el[1]] != 0 :
continue
else:
copy_board[el[0]][el[1]] = prev_len + 1
path[el] = prev_len + 1
next_arr.append(el)
queue+=next_arr
print(copy_board[1][m])
: BFS는 이렇게 최단거리를 측정할 때 '한칸씩 한칸씩' 서로 다른 경로를 탐색할 수 있다는 점에서 DFS와 차이가 나고, 그에 따라 DFS가 아닌 BFS로 이렇게 최단거리를 구할 수 있다는 점을 알아둬야할 것 같다.