백준
[백준/bfs] 2589번 : 보물섬
ydin
2024. 2. 12. 19:27
- 문제 : https://www.acmicpc.net/problem/2589
정답 풀이
두 보물 간의 거리 중 최댓값을 구하는 문제다. 근데 두 보물의 위치가 정확히 나온 것은 아니고, "보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다." 문구에서 처럼 두 보물의 위치는 상황마다 달라서 매번 구해야 한다. 이는 모든 육지지점(L)에 대해서 bfs로 탐색 후 가장 긴 길이 중 최댓값을 출력하라는 걸로 이해했다.
1. 주어진 행렬에서 모든 L 지점을 시작으로 bfs를 진행한다.
2. 지나온 칸 개수를 visit에 기록하고, 각 케이스에서 visit의 최댓값을 result에 추가한다.
3. max(result) - 1 값을 출력한다. (두 지점 간의 거리를 출력하기 때문에 1을 뺐다. 1 안 빼면 틀린다!)
# python3 - 시간 초과, pypy3 - 성공 하는 코드
def bfs(i, j, visit):
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
queue = [[i, j]]
visit[i][j] = 1
while queue:
x, y = queue.pop(0)
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if matrix[nx][ny] == 'L' and not visit[nx][ny]:
visit[nx][ny] = visit[x][y] + 1
queue.append([nx, ny])
n, m = map(int, input().split())
matrix = [list(input()) for _ in range(n)]
result = []
for i in range(n):
for j in range(m):
if matrix[i][j] == 'L':
visit = [[0] * m for _ in range(n)]
bfs(i, j, visit)
answer = 0
for k in range(n):
answer = max(answer, max(visit[k]))
result.append(answer)
print(max(result) - 1)