새소식

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)

풀이완료~

'PS > 백준' 카테고리의 다른 글

[백준/1890] 점프 (Python)  (0) 2023.05.23
[백준/2234] 성곽 (Python)  (0) 2023.05.22
[백준/1189] 컴백홈 (Python)  (0) 2023.05.17
[백준/1904] 01타일 (Python)  (0) 2023.05.14
[백준/11057] 오르막 수 (Python)  (0) 2023.05.11
Contents

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

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