코딩 테스트/백준
[Python] 백준 17086 아기 상어 2
위시리
2025. 2. 28. 17:22
문제 분석
- NxM 크기의 공간에 아기 상어
- 인접한 8 방향으로 이동 가능
풀이
- 최단 거리 → bfs
- 아기 상어 간의 거리를 구하고, 현재의 최대 길이와 비교
- 안전 거리를 어떻게 구할 수 있는가
- 모든 칸에서 부터 bfs를 탐색해 상어를 만날 때까지의 거리를 찾을 수도 있지만
- 상어의 위치부터 시작해 한 칸씩 bfs를 탐색하며 상어와의 거리를 기록하는 것이 더 효율적
- 단, 상어가 있는 칸을 1로 시작했기 때문에 최댓값 거리에서 -1을 해주어야 한다.
시간 복잡도
한 번 탐색된 정점은 다시 탐색하지 않기 때문에 O(NM) 개의 정점을 탐색힌다.
한 정점에서 8가지 방향으로 이동할 수 있기 때문에 8*O(NM)의 시간복잡도가 소요된다.
여기서 상수 배수를 무시하면 O(NM)
코드 설계
- input
- 상어의 위치를 큐에 넣고
- 상어로부터의 거리를 탐색하는 bfs 코드 구현
- 거리들 중 최댓값 확인 → 정답 출력
정답 코드
import sys
input = sys.stdin.readline
from collections import deque
n,m = map(int, input().split())
g = [list(map(int, input().split())) for _ in range(n)]
shark = deque()
dh = [-1, 1, 0, 0, -1, -1, 1, 1]
dw = [0, 0, -1, 1, -1, 1, -1, 1]
max_distance = 0
for i in range(n) :
for j in range(m) :
if g[i][j] == 1 :
shark.append((i, j))
def bfs() :
while shark :
h, w = shark.popleft()
for k in range(8) :
nh = h + dh[k]
nw = w + dw[k]
if nh < 0 or nh >= n or nw < 0 or nw >= m :
continue
if g[nh][nw] == 0:
shark.append((nh, nw))
g[nh][nw] = g[h][w] + 1
bfs()
ans = 0
for i in range(n) :
for j in range(m) :
ans = max(ans, g[i][j])
print(ans-1)