[Gold III] Title: 아기 상어, Time: 148 ms, Memory: 35036 KB -BaekjoonHub
This commit is contained in:
61
백준/Gold/16236. 아기 상어/README.md
Normal file
61
백준/Gold/16236. 아기 상어/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# [Gold III] 아기 상어 - 16236
|
||||
|
||||
[문제 링크](https://www.acmicpc.net/problem/16236)
|
||||
|
||||
### 성능 요약
|
||||
|
||||
메모리: 35036 KB, 시간: 148 ms
|
||||
|
||||
### 분류
|
||||
|
||||
너비 우선 탐색, 그래프 이론, 그래프 탐색, 구현, 시뮬레이션
|
||||
|
||||
### 제출 일자
|
||||
|
||||
2025년 4월 9일 19:56:28
|
||||
|
||||
### 문제 설명
|
||||
|
||||
<p>N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다.</p>
|
||||
|
||||
<p>아기 상어와 물고기는 모두 크기를 가지고 있고, 이 크기는 자연수이다. 가장 처음에 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한 칸씩 이동한다.</p>
|
||||
|
||||
<p>아기 상어는 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다. 아기 상어는 자신의 크기보다 작은 물고기만 먹을 수 있다. 따라서, 크기가 같은 물고기는 먹을 수 없지만, 그 물고기가 있는 칸은 지나갈 수 있다.</p>
|
||||
|
||||
<p>아기 상어가 어디로 이동할지 결정하는 방법은 아래와 같다.</p>
|
||||
|
||||
<ul>
|
||||
<li>더 이상 먹을 수 있는 물고기가 공간에 없다면 아기 상어는 엄마 상어에게 도움을 요청한다.</li>
|
||||
<li>먹을 수 있는 물고기가 1마리라면, 그 물고기를 먹으러 간다.</li>
|
||||
<li>먹을 수 있는 물고기가 1마리보다 많다면, 거리가 가장 가까운 물고기를 먹으러 간다.
|
||||
<ul>
|
||||
<li>거리는 아기 상어가 있는 칸에서 물고기가 있는 칸으로 이동할 때, 지나야하는 칸의 개수의 최솟값이다.</li>
|
||||
<li>거리가 가까운 물고기가 많다면, 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면, 가장 왼쪽에 있는 물고기를 먹는다.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>아기 상어의 이동은 1초 걸리고, 물고기를 먹는데 걸리는 시간은 없다고 가정한다. 즉, 아기 상어가 먹을 수 있는 물고기가 있는 칸으로 이동했다면, 이동과 동시에 물고기를 먹는다. 물고기를 먹으면, 그 칸은 빈 칸이 된다.</p>
|
||||
|
||||
<p>아기 상어는 자신의 크기와 같은 수의 물고기를 먹을 때 마다 크기가 1 증가한다. 예를 들어, 크기가 2인 아기 상어는 물고기를 2마리 먹으면 크기가 3이 된다.</p>
|
||||
|
||||
<p>공간의 상태가 주어졌을 때, 아기 상어가 몇 초 동안 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는지 구하는 프로그램을 작성하시오.</p>
|
||||
|
||||
### 입력
|
||||
|
||||
<p>첫째 줄에 공간의 크기 N(2 ≤ N ≤ 20)이 주어진다.</p>
|
||||
|
||||
<p>둘째 줄부터 N개의 줄에 공간의 상태가 주어진다. 공간의 상태는 0, 1, 2, 3, 4, 5, 6, 9로 이루어져 있고, 아래와 같은 의미를 가진다.</p>
|
||||
|
||||
<ul>
|
||||
<li>0: 빈 칸</li>
|
||||
<li>1, 2, 3, 4, 5, 6: 칸에 있는 물고기의 크기</li>
|
||||
<li>9: 아기 상어의 위치</li>
|
||||
</ul>
|
||||
|
||||
<p>아기 상어는 공간에 한 마리 있다.</p>
|
||||
|
||||
### 출력
|
||||
|
||||
<p>첫째 줄에 아기 상어가 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는 시간을 출력한다.</p>
|
||||
|
||||
65
백준/Gold/16236. 아기 상어/아기 상어.py
Normal file
65
백준/Gold/16236. 아기 상어/아기 상어.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import sys
|
||||
from collections import deque
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
n = int(input())
|
||||
graph = [list(map(int, input().split())) for _ in range(n)]
|
||||
|
||||
# 방향: 동 북 서 남
|
||||
dx = [0, -1, 0, 1]
|
||||
dy = [1, 0, -1, 0, 1]
|
||||
|
||||
# 초기 위치, 초기 크기
|
||||
for i in range(n):
|
||||
for j in range(n):
|
||||
if graph[i][j] == 9:
|
||||
now_x, now_y = i, j
|
||||
graph[i][j] = 0 # 상어 위치 초기화
|
||||
break
|
||||
|
||||
now_size = 2
|
||||
eat_cnt = 0
|
||||
result_time = 0
|
||||
|
||||
def bfs(x, y):
|
||||
visited = [[-1] * n for _ in range(n)]
|
||||
q = deque()
|
||||
q.append((x, y))
|
||||
visited[x][y] = 0
|
||||
fishes = []
|
||||
|
||||
while q:
|
||||
x, y = q.popleft()
|
||||
for i in range(4):
|
||||
nx = x + dx[i]
|
||||
ny = y + dy[i]
|
||||
if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == -1:
|
||||
# 상어 크기보다 작거나 같은 물고기면 이동 가능
|
||||
if graph[nx][ny] <= now_size:
|
||||
visited[nx][ny] = visited[x][y] + 1
|
||||
q.append((nx, ny))
|
||||
# 먹을 수 있는 물고기라면 저장
|
||||
if 0 < graph[nx][ny] < now_size:
|
||||
fishes.append((visited[nx][ny], nx, ny))
|
||||
# 먹을 수 있는 물고기들 반환
|
||||
return sorted(fishes)
|
||||
|
||||
while True:
|
||||
fish_list = bfs(now_x, now_y)
|
||||
|
||||
if not fish_list:
|
||||
break # 더 이상 먹을 물고기가 없으면 종료
|
||||
|
||||
dist, fish_x, fish_y = fish_list[0] # 가장 가까운 물고기
|
||||
result_time += dist
|
||||
eat_cnt += 1
|
||||
graph[fish_x][fish_y] = 0
|
||||
now_x, now_y = fish_x, fish_y
|
||||
|
||||
# 크기 증가
|
||||
if eat_cnt == now_size:
|
||||
now_size += 1
|
||||
eat_cnt = 0
|
||||
|
||||
print(result_time)
|
||||
Reference in New Issue
Block a user