[백준 BFS] 보물섬(python)

이진규·2022년 5월 16일
1

백준(PYTHON)

목록 보기
45/115

문제

https://www.acmicpc.net/problem/2589

나의 코드

"""

"""

from collections import deque
from sys import stdin
from copy import deepcopy

input = stdin.readline

n, m = map(int, input().split())
pan = [ list(input().rstrip()) for _ in range(n) ]

dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]
answer = 0

def bfs(x, y):
    global answer
    q = deque([(x, y)])

    visited = [[False] * m for _ in range(n)]
    visited[x][y] = True
    tmp = deepcopy(pan) # 모든 육지 지점에서 호출할 것이므로 매 호출마다 deepcopy()를 이용하여 임시 변수를 두어 계산한다.

    # 가장 긴 시간이 걸리는 값을 구하기 위해 max()를 쓸 것 이므로 육지는 0, 바다는 -1로 바꿔준다.
    for i in range(n):
        for j in range(m):
            if tmp[i][j] == 'L':
                tmp[i][j] = 0
            else:
                tmp[i][j] = -1

    while q:
        px, py = q.popleft()

        for k in range(4):
            mx = px + dx[k]
            my = py + dy[k]

            # 이동할 곳이 육지(0)이고 방문한 적이 없다면 방문처리와 거리를 계산 후 큐에 넣어준다.
            if 0 <= mx < n and 0 <= my < m:
                if tmp[mx][my] == 0 and not visited[mx][my]:
                    visited[mx][my] = True
                    tmp[mx][my] = tmp[px][py] + 1
                    q.append((mx, my))

    # bfs가 끝나면 가장 긴 시간이 걸리는 값을 갱신해준다.
    for i in tmp:
        answer = max(answer, max(i))


for i in range(n):
    for j in range(m):

        # 시작하는 지점에 따라 최단 거리로 이동하는데 가장 긴 시간이 달라지므로 모든 육지 지점에서 bfs를 호출해주고 정답을 갱신해준다.
        if pan[i][j] == 'L':
            bfs(i, j)

print(answer)


    

설명

문제 설명 그대로 코드를 구현하면 쉽게 풀 수 있다.
자세한 내용은 주석에 달아 놓음.

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글