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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 2343번] 파이썬 - 기타 레슨 (0) | 2023.11.29 |
---|---|
[백준 16973번] 파이썬 - 직사각형 탈출 (1) | 2023.11.29 |
[백준 1969번] 파이썬 - DNA (1) | 2023.11.19 |
[백준 16960번] 파이썬 - 스위치와 램프 (1) | 2023.11.18 |
[백준 5883번] 파이썬 - 아이폰 9S (0) | 2023.11.07 |