Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 온디바이스AI
- Extendable hashing
- 네트워크
- 데이터베이스
- 운영체제
- 시스템프로그래밍
- vite
- SDK
- 인터럽트
- 김영한
- B tree 데이터삽입
- 반효경
- 코딩애플
- 백엔드
- 트랜잭션
- 시그널 핸들러
- 쉬운코드
- recoverability
- CPU 스케줄링
- 쉬운 코드
- 코딩테스트 [ ALL IN ONE ]
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- 운영체제와 정보기술의 원리
- 갤럭시 S24
- Git
- concurrency control
- 프로세스 주소 공간
- SQL
- 커널 동기화
- 개발남노씨
Archives
- Today
- Total
티끌모아 태산
[필수]백준: 아기상어2_17086 본문
728x90
https://www.acmicpc.net/problem/17086
17086번: 아기 상어 2
첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸과 상어의 수가 각각 한 개 이상인 입력만
www.acmicpc.net
핵심 아이디어
- BFS 탐색알고리즘
- 좌표 0을 bfs로 돌리는 것이 아니라 상어를 각각 bfs를 적용해서 최대 안전거리를 구한다.
- 보통 4가지 방향을 고려하는데, 여기서는 8가지 방향을 고려!
구현코드
'''
안전거리는 그 칸과 가장 거리가 가까운 아기 상어와의 가리
안전거리의 최댓값 구하기.
즉, 가장 가까운 상어이면서 거리가 최대인 안전거리 구하기
모든 0에 대해서 bfs하는것 아니라 상어마다 bfs 한다.
bfs의 최단거리 문제와 유사.
'''
import sys
from collections import deque
n,m = map(int, input().split())
graph = []
q = deque() # 상어의 위치를 덱에 담는다.
for i in range(n):
graph.append(list(map(int, input().split())))
for j in range(m):
if graph[i][j] == 1:
q.append((i,j))
# 방향 정의 8가지 방향
# 북서, 북, 북동, 동, // 남동, 남, 남서, 서
dx = [-1, -1, -1, 0, 1, 1, 1, 0]
dy = [-1, 0, 1, 1, 1, 0, -1, -1]
ans = 0 # 최장 거리 변수
while q:
# 첫 번째 상어의 위치
x,y = q.popleft()
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y] + 1
q.append((nx,ny))
# 안전거리 최댓값 갱신
ans = max(ans, graph[nx][ny])
print(ans-1) # 첫번째를 포함했기 때문에 마지막에 빼준다.
728x90
'백준 문제 > BFS,DFS' 카테고리의 다른 글
[필수]백준: 치즈_2636 (1) | 2024.02.01 |
---|---|
[필수]백준: 치킨배달_15686 (0) | 2024.01.31 |
[필수]백준 : 감시_15683 (0) | 2024.01.31 |