Algorithm(BOJ, Python)/BFS&DFS
[백준_2589] 보물섬 python
kurooru
2022. 9. 5. 22:53
바보같이 처음에 리커전을 통해,
두 좌표의 조합을 모두 구해 해결하려는 판단을 해 버렸고,
어림도없이 시간초과에 걸려버렸다.
# 입력 속도 개선
import sys
input = sys.stdin.readline
# n, m 입력
n, m = map(int, input().split())
# island 설계
island = [
[0] * m
for _ in range(n)
]
# island 입력
for i in range(n):
s = input()
for j in range(m):
# 땅이면
if s[j] == 'L':
# 1로 처리
island[i][j] = 1
# 함수들
# in_range(x, y)
def in_range(x, y):
return 0 <= x < n and 0 <= y < m
# can_go(x, y)
def can_go(x, y):
# 범위 내에 있고, 육지이며, 방문한 적이 없으면 가능
return in_range(x, y) and island[x][y] and not visited[x][y]
# bfs()
def bfs():
while q:
x, y = q.popleft()
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
for dx, dy in zip(dxs, dys):
nx, ny = x + dx, y + dy
# 갈 수 있으면,
if can_go(nx, ny):
# 큐에 넣어주고,
q.append((nx, ny))
# 방문 처리 해 주고,
visited[nx][ny] = 1
# step 배열 관리
step[nx][ny] = step[x][y] + 1
# simulate(x, y)
def simulate(x, y):
# 전역 변수 선언
global visited, step
# visited 선언 및 초기화
visited = [
[0] * m
for _ in range(n)
]
# step 선언 및 초기화
step = [
[0] * m
for _ in range(n)
]
# bfs
q.append((x, y))
visited[x][y] = 1
bfs()
# 현재 최댓값
curr_max = 0
# step 돌면서
for i in range(n):
for j in range(m):
# 발견한 값이 현재 최댓값보다 크다면
if step[i][j] > curr_max:
# 최댓값 교체
curr_max = step[i][j]
# 최댓 값 반환
return curr_max
# 설계
# 거리의 최댓 값 설정
max_dist = 0
# 큐 사용준비
from collections import deque
q = deque()
# 섬을 돌면서
for i in range(n):
for j in range(m):
# 땅을 발견하면,
if island[i][j]:
# 시뮬레이션 돌려서 더 큰 값을 넣기
max_dist = max(max_dist, simulate(i, j))
# 출력
print(max_dist)