728x90
💎
https://www.acmicpc.net/problem/2589
2589번: 보물섬
보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서
www.acmicpc.net
내 풀이
from collections import deque
def bfs(x, y):
q = deque()
q.append((x, y))
distance = 0
temp = [[0] * M for _ in range(N)]
visited = [[False] * M for _ in range(N)]
visited[x][y] = True
while q:
cx, cy = q.popleft()
for k in range(4):
nx, ny = cx + dx[k], cy + dy[k]
if 0 <= nx < N and 0 <= ny < M and map[nx][ny] == 'L' and not visited[nx][ny]:
visited[nx][ny] = True
distance = temp[cx][cy] + 1
temp[nx][ny] = distance
q.append((nx, ny))
return distance
N, M = map(int, input().split())
map = [[] * M for _ in range(N)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
ans = 0
for i in range(N):
map[i] = list(input())
for i in range(N):
for j in range(M):
if map[i][j] == 'L': # 육지 발견
ans = max(bfs(i, j), ans)
print(ans)
bfs(너비 우선 탐색)로 풀었다.
코드 설명
지도 전체를 돌면서, 육지를 발견할 때마다 bfs를 호출한다.
육지들마다 최단거리로 이동하는 데 가장 긴 시간이 걸리는 육지가 다르기 때문에,
모든 육지를 탐색한 후 최댓값을 알아내야 한다.
for i in range(N):
for j in range(M):
if map[i][j] == 'L': # 육지 발견
ans = max(bfs(i, j), ans)
✔️ bfs 함수
distance: 현재 육지에서 가장 긴 시간이 걸리는 육지까지 최단거리로 이동하는 시간
temp: 이동 시간을 저장하기 위한 이차원 리스트
visited: 이미 방문한 육지인지 구별하기 위한 이차원 리스트
bfs가 불릴 때마다 초기화된다.
distance = 0
temp = [[0] * M for _ in range(N)]
visited = [[False] * M for _ in range(N)]
visited[x][y] = True
현재 좌표를 기준으로 상하좌우를 검사한다.
좌표가 범위 내에 있으며 방문하지 않은 육지인 경우,
방문 처리 후, distance에 현재 좌표에서부터 새 좌표까지의 이동 시간을 저장한다.
그 값이 새 좌표의 값이 된다.
deque에 새 좌표를 추가한다.
for k in range(4):
nx, ny = cx + dx[k], cy + dy[k]
if 0 <= nx < N and 0 <= ny < M and map[nx][ny] == 'L' and not visited[nx][ny]:
visited[nx][ny] = True
distance = temp[cx][cy] + 1
temp[nx][ny] = distance
q.append((nx, ny))
'코딩테스트' 카테고리의 다른 글
[백준][Python] 2660 회장뽑기 (0) | 2024.03.14 |
---|---|
[백준][Python] 2885 초콜릿 식사 (0) | 2024.03.13 |
[백준][Python] 11728 배열 합치기 (1) | 2024.03.12 |
[백준][Python] 2018 수들의 합 5 (0) | 2024.03.11 |
[백준][Python] 2422 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2024.03.11 |