N
: 공간의 세로 크기 ()
M
: 공간의 가로 크기 ()
✅ 입력 조건
1.N
,M
입력
2.N
번 반복해 공간 상태 입력
3.0
→ 빈칸 /1
→ 아기 상어 의미
✅ 출력 조건
1. 안전 거리의 최댓값 출력
전체 공간을 돌면서 값이 아기 상어가 있는 위치를 의미하는 1의 위치를 찾고, 그 위치에서 BFS를 수행해 방문하지 않고 0을 가지는 칸을 탐색한다.
그 위치까지 몇 칸을 지났는지에 대한 변수를 정의하고, while
문을 통해 8가지 방향을 확인하면서 그리드 내의 방문하지 않은 칸이 있다면 BFS를 수행하도록 구현한다.
이 과정을 진행하면서 칸 수를 1씩 증가하며 카운트해준다.
안전 거리가 가장 큰 칸을 구해야 하므로 위와 같이 카운트된 이동 칸수를 max()
함수를 통해 갱신해준다.
공간 상태 입력 →
전체 공간에서 BFS →
최종 시간복잡도
최악의 경우 이 된다.
이는 2초 내에 연산이 가능하다.
전체 공간에서 상어 위치부터 시작하는 BFS 수행
import sys
from collections import deque
input = sys.stdin.readline
# BFS 구현
def bfs(shark):
# 이동 칸수 변수
max_distance = 0
queue = deque(shark)
while queue:
x, y, distance = queue.popleft()
for direction in directions:
nx, ny = x + direction[0], y + direction[1]
# 공간 내 방문 안한 칸이라면 탐색 지속
if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] == 0:
# 방문 처리 = 해당 칸까지의 이동 칸 수 저장
graph[nx][ny] = distance + 1
# 큐 저장
queue.append((nx, ny, distance + 1))
# 최대 거리 갱신
max_distance = max(max_distance, distance + 1)
return max_distance
# 8가지 방향 정의
directions = [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]
# N, M 입력
N, M = map(int, input().split())
# 그래프 초기화
graph = []
# 공간 상태 입력
for _ in range(N):
graph.append(list(map(int, input().split())))
# 상어 위치 찾기
shark = []
for i in range(N):
for j in range(M):
if graph[i][j] == 1:
# 상어 위치부터 시작할 것이므로 거리 0 추가
shark.append((i, j, 0))
# 결과 출력
print(bfs(shark))