알고리즘/문제풀이

[Python] 백준 17086 아기 상어 2

정찡이 2021. 10. 30. 00:17
728x90

1. 문제 링크

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

 

17086번: 아기 상어 2

첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸의 개수가 한 개 이상인 입력만 주어진다.

www.acmicpc.net


2. 문제 요약

  • 안전거리 최댓값 구하기


3. 아이디어 정리

  • bfs 탐색을 통해 최단 거리 구하기

4. 문제 풀이

4-1. 내 풀이

import sys
from collections import deque
dx = [-1, -1, -1, 0, 1, 0, 1, 1]
dy = [-1, 0, 1, 1, 1, -1, 0, -1]

n, m = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]

dq = deque()
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:  # 상어가 있는 위치에서 탐색하기 위해 
            dq.append([i, j])

result = 0
# 상어 있는 위치 기준으로 최단 거리 구하기 
while dq:
    x, y = dq.popleft()
    for d in range(8):
        nx = x + dx[d]
        ny = y + dy[d]
        if nx < 0 or ny < 0 or nx >= n or ny >= m:
            continue
        if graph[nx][ny] != 0:
            continue
        dq.append([nx, ny])
        graph[nx][ny] = graph[x][y] + 1
        result = max(result, graph[x][y] + 1)
print(result - 1)

 


5. 결론

  • bfs 문제 중 최단거리 구하기와 동일한 문제
반응형