새소식

PS/백준

[백준/14940] 쉬운 최단거리 (Python)

  • -

Problem : 

 

Difficulty : Silver 1

 

Status : Solved

 

Time : 00:06:48

 


 

문제 설명

 

더보기

지도가 주어지면 모든 지점에 대해서 목표지점까지의 거리를 구하여라.

문제를 쉽게 만들기 위해 오직 가로와 세로로만 움직일 수 있다고 하자.

 

입력 및 출력

 

더보기

입력

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)

다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이다. 입력에서 2는 단 한개이다.

 

출력

각 지점에서 목표지점까지의 거리를 출력한다. 원래 갈 수 없는 땅인 위치는 0을 출력하고, 원래 갈 수 있는 땅인 부분 중에서 도달할 수 없는 위치는 -1을 출력한다.

 

입력 예시

15 15 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1

 

출력 예시

 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 11 12 13 14 15 16 17 18 19 20 0 0 0 0 25 12 13 14 15 16 17 18 19 20 21 0 29 28 27 26 13 14 15 16 17 18 19 20 21 22 0 30 0 0 0 14 15 16 17 18 19 20 21 22 23 0 31 32 33 34

 

 


 

풀이

 

이런 류의 문제를 풀때, 목적지와 출발지의 개념은 얼마든지 바뀔 수 있음을 유념하자!

 

무방향 경로이므로 출발지 - 도착지의 거리는 뒤집어도 동일하다. 따라서 목표지점을 시작으로 한 번의 탐색을 통해 모든 노드와의 거리를 구해 주면 된다!

 

 

풀이 코드

from collections import deque import sys input = sys.stdin.readline dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] N, M = map(int, input().split()) visited = [[float('inf')]*M for _ in range(N)] map_list = list() q = deque() for i in range(N) : _map_list = list(map(int, input().split())) for j in range(M) : if _map_list[j] == 2 : visited[i][j] = 0 q.append((j, i, 0)) elif _map_list[j] == 0 : visited[i][j] = 0 map_list.append(_map_list) while q : x, y, dist = q.popleft() for k in range(4) : ax, ay = x + dx[k], y + dy[k] if -1 < ax < M and -1 < ay < N and map_list[ay][ax] == 1 and visited[ay][ax] > dist + 1 : visited[ay][ax] = dist + 1 q.append((ax, ay, dist+1)) for i in range(N) : for j in range(M) : if visited[i][j] == float('inf') : visited[i][j] = -1 for _visited in visited : print(*_visited)

풀이완료~

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.