문제
https://www.acmicpc.net/problem/2589
2589번: 보물섬
보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서
www.acmicpc.net
문제 요약
각 칸이 육지(L), 바다(W)로 이루어진 2차원 배열 보물 지도가 있다.
보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀 있다.
+ 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나 멀리 돌아가서는 안된다.
보물이 묻혀 있는 두 곳 간의 최단 거리로 이동하는 시간을 출력한다.
+ 한 칸을 이동하는 데 1이 걸린다.
코드
from collections import deque
def bfs(i, j):
global res, height, width
check = [[0] * width for _ in range(height)]
que = deque()
que.append([i, j])
check[i][j] = 1
while que:
x, y = que.popleft()
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if 0 <= nx and 0 <= ny and nx < height and ny < width and check[nx][ny] == 0 and board[nx][ny] == 'L':
que.append([nx, ny])
check[nx][ny] = check[x][y] + 1
res = max(res, check[nx][ny])
height, width = map(int, input().split())
board = [list(input()) for _ in range(height)]
res = 0
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for i in range(height):
for j in range(width):
if board[i][j] == 'L':
bfs(i, j)
print(res - 1)
코드 설명
모든 육지 인덱스에서 보물이 묻혀 있다 가정하고, 큐를 이용하여 넓이 우선 탐색 (BFS) 을 진행한다.
=> 해당 인덱스부터 최단 경로의 가장 멀리 있는 인덱스까지의 거리를 계산하고 res를 갱신한다.
최단 경로의 가장 멀리 있는 인덱스까지의 거리 = 보물이 묻혀 있는 다른 한 곳까지의 거리
+ Python으로 제출 시 시간 초과 문제가 발생하므로, PyPy3로 제출해야한다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/Python] 1916번: 최소비용 구하기 (0) | 2023.11.17 |
---|---|
[백준/Python] 1753번: 최단 경로 (1) | 2023.11.16 |
[백준/Python] 7562번: 나이트의 이동 (2) | 2023.11.15 |
[백준/Python] 2178번: 미로 탐색 (0) | 2023.10.01 |
[백준/Python] 17471번: 게리맨더링 (1) | 2023.09.30 |