728x90

시간 제한 1초, 메모리 제한 512MB

# 조건

  • 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다.

  • 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다.

  • 각 칸은 육지(L)나 바다(W)로 표시되어 있다.

  • 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다.

  • 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다.

  • 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안 된다.

    ![[Algorithm/baekjoon_python/assets/Pasted image 20231124084045.png]]

  • 예를 들어 위와 같이 지도가 주어졌다면 보물은 아래 표시된 두 곳에 묻혀 있게 되고, 이 둘 사이의 최단 거리로 이동하는 시간은 8시간이 된다.

    ![[Algorithm/baekjoon_python/assets/Pasted image 20231124084151.png]]

  • 보물 지도가 주어질 때, 보물이 묻혀 있는 두 곳 간의 최단 거리로 이동하는 시간을 구하는 프로그램을 작성하시오.

입력

  • 첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다.
  • 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다.
  • 보물 지도의 가로, 세로의 크기는 각각 50이하이다.

출력

  • 첫째 줄에 보물이 묻혀 있는 두 곳 사이를 최단 거리로 이동하는 시간을 출력한다.

# 접근 방법

  • 문제를 잘 읽어야 된다.
  • 보물의 위치가 주어지는 것이 아닌 서로 간의 거리가 가장 먼 육지 2곳이 보물의 위치 이다.
  • 가로, 세로의 전체 크기는 50X50 이하이므로 각 육지에서 다른 육지까지의 거리를 모두 구해준다.
  • BFS를 이용하여 현재 위치에서 갈 수 있는 모든 육지를 탐색하며 가장 마지막에 도착하는 곳이 제일 먼 곳이다.
  • 이 값을 result와 비교하여 갱신해주며 모든 육지를 탐색해준다.
import sys
input = sys.stdin.readline
from itertools import combinations
from collections import deque

"""
보물 => 서로 간 최단 거리 이동 시 가장 긴 시간이 걸리는 육지 두 곳
육지 => L, 바다 => W
모든 육지에서 다른 육지로의 거리 구하기
"""

"""
bfs 함수 => 인자로는 시작 위치, 도착 위치
최단 거리 탐색하면서 도착시 거리 return
"""
def bfs(start):
    global result
    visited = [[-1] * M for _ in range(N)]
    q = deque()
    visited[start[0]][start[1]] = 0
    q.append((start[0], start[1]))
    while q:
        si, sj = q.popleft()
        for d in range(4):
            ni, nj = si+di[d], sj+dj[d]
            if 0<=ni<N and 0<=nj<M and visited[ni][nj] == -1 and arr[ni][nj] == 'L':
                visited[ni][nj] = visited[si][sj] + 1
                q.append((ni, nj))
    for v in visited:
        result = max(result, max(v))



# 델타함수 - 상하좌우
# 세로 가로 크기 + 지도 정보
di, dj = [1, -1, 0, 0], [0, 0, -1, 1]
N, M = map(int, input().split())
arr = [list(input().rstrip()) for _ in range(N)]

result = 0
# 모든 육지 탐색
for i in range(N):
    for j in range(M):
        if arr[i][j] == 'L':
            bfs((i, j))

# 조합으로 모든 육지간의 거리 구하기
print(result)
728x90