https://www.acmicpc.net/problem/14940
목표지점까지의 거리를 찾는 문제이기 때문에 BFS로 풀어야 합니다.
우선 지도를 입력받을 때 2의 위치를 파악하기 위해 지도를 입력받을 때 검사를 진행했습니다.
for i in range(n):
row = list(map(int,input().split()))
graph.append(row)
for j in range(m):
if row[j] == 2:
x,y = i,j
(row에서 2를 찾을 때 row[i][j]라고 했다가 계속 오류가 발생해서 찾느라 고생 좀 했읍니다..)
입력 받은 graph를 통해 결과를 저장할 visited 배열을 선언했습니다.
저는 graph를 모두 검사하여 이동할 수 있는 곳(1)이면 -1로 설정하고 지나가지 못하는 곳(0)이면 0으로 설정했습니다.
visited = [[-1 if graph[i][j] == 1 else 0 for j in range(m)] for i in range(n)]
이제 목표지점으로부터의 거리를 측정할 함수를 선언해줍니다.
def bfs(X,Y):
# 상,하,좌,우 방향
dx = [-1,1,0,0]
dy = [0,0,-1,1]
queue = deque([(X,Y)]) # 시작 지점
visited[X][Y] = 0 # 시작 지점으로부터 거리는 0
while queue:
x,y = queue.popleft()
# 4방향 탐색
for i in range(4):
nx,ny = x+dx[i], y+dy[i]
if 0 <= nx < n and 0 <= ny < m: # 범위 내일 때
if visited[nx][ny] == -1 and graph[nx][ny] == 1: # 방문하지 않은 곳 && 이동할 수 있는 땅
queue.append((nx,ny))
visited[nx][ny] = visited[x][y] + 1 # 거리 +1
from collections import deque
import sys
input = sys.stdin.readline
def bfs(X,Y):
queue = deque([(X,Y)])
visited[X][Y] = 0
while queue:
x,y = queue.popleft()
for i in range(4):
nx,ny = x+dx[i], y+dy[i]
if 0 <= nx < n and 0 <= ny < m:
if visited[nx][ny] == -1 and graph[nx][ny] == 1:
queue.append((nx,ny))
visited[nx][ny] = visited[x][y] + 1
if __name__ == "__main__":
n,m = map(int,input().split())
dx = [-1,1,0,0]
dy = [0,0,-1,1]
graph = []
x,y = 0,0
for i in range(n):
row = list(map(int,input().split()))
graph.append(row)
for j in range(m):
if row[j] == 2:
x,y = i,j
visited = [[-1 if graph[i][j] == 1 else 0 for j in range(m)] for i in range(n)]
bfs(x,y)
for row in visited:
print(*row)
안녕하세요~! 수박강아지님! 백준 푸시느라 고생많으셨습니다. 혹시 백준에서 푼 문제를 효율적으로 복습하고 정리하는 데 관심 있으시다면, https://mycodingtest.com 서비스를 한번 이용해보세요! 제가 진행한 개인 프로젝트인데 벨로그에서 백준 푸시는 분들께 댓글로 이렇게 홍보를 하고있습니다. 코테 준비에 도움이 됬으면 합니다! 😊