(BOJ)-2589, Python
(BOJ)-2589, Python
문제 요약
출처: (BOJ)2589 - 보물섬
$N \times M$ 크기의 지도가 주어진다. 각 칸은 육지($L$) 또는 바다($W$) 로 표시되어 있으며, 이동은 육지에서만 가능하다. 한 칸 이동하는 데 1시간이 걸릴 때, 가장 멀리 떨어진 두 육지(보물이 묻혀 있는 곳) 사이의 최단 이동 시간을 구하는 문제이다.
이동은 상하좌우로 가능하다.
같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안 된다.
접근 과정
1. BFS(큐)
“멀리 돌아가서는 안 된다” 는 조건을 보고, 이전 포스트에서 다룬 것처럼 종점까지의 경로에 돌아가는 루트와 빠른 루트가 있을 경우, 최단 거리를 구하기에는 BFS로 구현하는 것이 더 효율적이라 생각해서 바로 접근했다.
코드 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pypy3 제출
from collections import deque
N, M = map(int, input().split())
graph = [list(map(str, input().rstrip())) for _ in range(N)]
answer = 0
for y in range(N):
for x in range(M):
if graph[y][x] != 'L':
continue
visited = [[0 for _ in range(M)] for _ in range(N)]
dist = [[0 for _ in range(M)] for _ in range(N)]
q = deque()
q.append([y,x])
visited[y][x] = 1
while q:
_y, _x = q.popleft()
for mv_y, mv_x in [[0, -1],[0, 1], [-1, 0],[1, 0]]:
dy = _y + mv_y
dx = _x + mv_x
if 0 <= dy < N and 0 <= dx < M:
if graph[dy][dx] == 'L':
if visited[dy][dx] == 0:
visited[dy][dx] = 1
dist[dy][dx] = dist[_y][_x] + 1
q.append([dy,dx])
answer = max(answer, max(map(max, dist)))
print(answer)
회고
python3에서는 시간초과가 났다. 코드를 더 효율적으로 짤 수 있다는 것인데, 논리를 조금 더 세분화해서 짜려고 시도해봐야겠다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.