Python/백준 문제 풀이
[BOJ] 14940번 쉬운 최단거리
서원두
2022. 9. 10. 13:49
약간의 변형이 들어간 BFS(Breadth First Search) 문제다. 다만 어디까지나 약간의 변형이므로 BFS 처리에 집중하는 것이 중요하다.
이 문제는 누가 봐도 BFS라는 것을 알 수 있다. 하나뿐인 시작 지점인 2를 찾고, 그 지점에서 BFS를 돌리면서 닿는 구간마다 1을 더해주면 된다.
본인은 여기서 약간의 변형인 "1인 지점이지만 갈 수 없는 곳이라면 -1을 출력한다"에서 실수를 저지르고 말았다. 문제를 끝까지 읽어야 겠다는 생각만 든다...
import sys
from collections import deque
def bfs(I, J, N, M):
visited = [[False for _ in range(M)] for _ in range(N)]
dist = [[0 for _ in range(M)] for _ in range(N)]
travel = deque([[I, J]])
di, dj = [1, -1, 0, 0], [0, 0, 1, -1]
while travel:
now_i, now_j = travel.popleft()
if visited[now_i][now_j]:
continue
visited[now_i][now_j] = True
for i in range(4):
next_i, next_j = now_i+di[i], now_j+dj[i]
if 0 <= next_i < N and 0 <= next_j < M and not visited[next_i][next_j]:
if graph[next_i][next_j] == 1:
travel.append([next_i, next_j])
if dist[next_i][next_j] == 0:
dist[next_i][next_j] = dist[now_i][now_j] + 1
for i in range(N):
for j in range(M):
if graph[i][j] == 1 and dist[i][j] == 0:
dist[i][j] = -1
for now_dist in dist:
print(*now_dist)
if __name__ == '__main__':
n, m = map(int, sys.stdin.readline().rstrip().split())
graph = list()
for _ in range(n):
graph.append(list(map(int, sys.stdin.readline().rstrip().split())))
for i in range(n):
for j in range(m):
if graph[i][j] == 2:
bfs(i, j, n, m)
exit()
코드에서의 어려움은 크게 없다.
입력을 받고, 2인 곳을 찾는 즉시 BFS를 돌려서 거리를 구하고, 1이지만 BFS로 돌지 못했다면 그 부분만 -1로 바꿔준 후 BFS 최종 결과를 출력하고 종료하면 된다.
728x90