일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준 #파이썬 #알고리즘 #코딩테스트
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 자바 #java
- 코딩테스트
- java #자바 #나동빈
- 다익스트라
- 백준 #알고리즘 #파이썬 #코딩테스트
- 다이나믹프로그래밍
- java #자바
- css #웹 #생활코딩
- 재귀
- 파이썬 #백준 #알고리즘 #코딩테스트
- Dijkstra
- PYTHON
- dp
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 파이썬
- 투포인터
- 알고리즘
- DFS
- java #자바 #동빈나
- react #리액트 #동빈나
- 백준
- java #자바 #생활코딩
- 프로그래머스
- BFS
- css #생활코딩 #웹
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 백트랙킹
Archives
- Today
- Total
커리까지
[백준] 17086번 아기상어2 본문
728x90
SMALL
문제
N×M 크기의 공간에 아기 상어 여러 마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 아기 상어가 최대 1마리 존재한다.
어떤 칸의 안전 거리는 그 칸과 가장 거리가 가까운 아기 상어와의 거리이다. 두 칸의 거리는 하나의 칸에서 다른 칸으로 가기 위해서 지나야 하는 칸의 수이고, 이동은 인접한 8방향(대각선 포함)이 가능하다.
안전 거리가 가장 큰 칸을 구해보자.
입력
첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸과 상어의 수가 각각 한 개 이상인 입력만 주어진다.
출력
첫째 줄에 안전 거리의 최댓값을 출력한다.
예제 입력 1
5 4
0 0 1 0
0 0 0 0
1 0 0 0
0 0 0 0
0 0 0 1
예제 출력 1
2
예제 입력 2
7 4
0 0 0 1
0 1 0 0
0 0 0 0
0 0 0 1
0 0 0 0
0 1 0 0
0 0 0 1
예제 출력 2
2
제출 답안
- 각 칸마다 아기 상어를 제외하고 도달 하기 위한 횟수를 증가한다.
- 대각선도 방문해야 하니 dy, dx에 대각선 위치도 추가한다.
- 마지막에 1을 빼는 이유는 상어가 1인데 1부터 누적하였기에 1을 뺀다.
'''
1. 아이디어
- 상어에서 해당 칸 까지의 거리를 계속 업데이트
2. 시간 복잡도
- O(v+E)
- v = NM
- e = 4v
= 5(50*50) = 500 < 2억
3. 자료구조
int [][]
'''
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
graph = []
q = deque()
for i in range(n):
row = list(map(int, input().split()))
for idx, j in enumerate(row):
if j == 1:
# 여기서 미리 아기 상어 위치를 q에 담는다.
q.append((i, idx))
graph.append(row)
dy = [0,1,0,-1, -1, 1, 1, -1]
dx = [1, 0, -1, 0, 1, 1, -1, -1]
def bfs():
while q:
y, x = q.popleft()
for k in range(8):
ny = y + dy[k]
nx = x + dx[k]
if 0<=ny<n and 0<=nx<m:
if graph[ny][nx] == 0:
q.append((ny, nx))
graph[ny][nx] = graph[y][x] + 1
return
bfs()
answer = 0
for row in graph:
answer = max(answer, max(row))
print(answer - 1)
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[백준] 7562번 나이트의 이동 파이썬 (0) | 2022.12.15 |
---|---|
[백준] 1260번 DFS와 BFS 파이썬 (0) | 2022.12.14 |
[백준] 21736번 헌내기는 친구가 필요해 (0) | 2022.12.12 |
[백준] 16953번 A->B (1) | 2022.12.11 |
[백준] 24480번 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2022.12.10 |
Comments