N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다.
아기 상어와 물고기는 모두 크기를 가지고 있고, 이 크기는 자연수이다. 가장 처음에 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한 칸씩 이동한다.
아기 상어는 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다. 아기 상어는 자신의 크기보다 작은 물고기만 먹을 수 있다. 따라서, 크기가 같은 물고기는 먹을 수 없지만, 그 물고기가 있는 칸은 지나갈 수 있다.
아기 상어가 어디로 이동할지 결정하는 방법은 아래와 같다.
아기 상어의 이동은 1초 걸리고, 물고기를 먹는데 걸리는 시간은 없다고 가정한다. 즉, 아기 상어가 먹을 수 있는 물고기가 있는 칸으로 이동했다면, 이동과 동시에 물고기를 먹는다. 물고기를 먹으면, 그 칸은 빈 칸이 된다.
아기 상어는 자신의 크기와 같은 수의 물고기를 먹을 때 마다 크기가 1 증가한다. 예를 들어, 크기가 2인 아기 상어는 물고기를 2마리 먹으면 크기가 3이 된다.
공간의 상태가 주어졌을 때, 아기 상어가 몇 초 동안 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는지 구하는 프로그램을 작성하시오.
from collections import deque
def bfs(y,x):
global eat, size, dist
visited = [[-1] * N for _ in range(N)]
visited[y][x] = 0
fish = [] # 먹을 수 있는 물고기들 저장하기 위한 리스트 생성
q = deque()
q.append((y, x))
while q:
while q:
y, x = q.popleft()
for i in range(4):
ny = y + dr[i]
nx = x + dc[i]
if 0 <= ny < N and 0 <= nx < N:
if visited[ny][nx] == -1:
if sea[ny][nx] !=0 and sea[ny][nx] < size: # 먹은 물고기들 fish 리스트에 추가(이동시간도 함께)
visited[ny][nx] = visited[y][x] + 1
fish.append((ny,nx,visited[ny][nx]))
elif sea[ny][nx] <= size: # 사이즈와 같거나 작으면 이동
visited[ny][nx] = visited[y][x] + 1
q.append((ny, nx))
if fish:
# 이동 시간, 제일 위쪽, 제일 왼쪽 순으로 정렬을 해줌
fish.sort(key=lambda x: (x[2], x[0], x[1]))
i, j, d = fish[0][0], fish[0][1],fish[0][2] # 우선순위 제일 높은거부터 좌표 가지고 오기
dist += visited[i][j] # 소요 시간 더 해주기
sea[i][j] = 0 # 먹은 물고기==현재 상어위치 0 으로
visited = [[-1] * N for _ in range(N)] # visited 재생성
visited[i][j] = 0 # 시작 위치 0
q = deque()
q.append((i, j))
eat += 1 # 먹은 물고기 횟수와 사이즈 비교
if eat == size:
size += 1
eat = 0
fish =[]
N = int(input())
sea = [list(map(int, input().split())) for _ in range(N)]
size = 2 # 아기 상어 처음 사이즈
eat = 0 # 물고기 먹은 횟수
dist = 0 # 이동 시간
dr = [-1, 1, 0, 0] # 상하좌우
dc = [0, 0, -1, 1]
for y in range(N):
for x in range(N):
if sea[y][x] == 9:
sea[y][x] = 0 # 아기 상어 위치 추가 및 0으로 변환
bfs(y,x)
print(dist)
어려웠다. 하지만 풀고 나서 다시 한번 복기를 해보니 내가 몰랐던건 lambda 부분뿐이었고 나머지 부분들은 다 할 수 있어어야했다. 아무리 문제가 복잡해도 차근차근 조건 하나하나씩 차분히 고려를 하고 로직을 짜야겠다라는 느낌을 준 문제. 사실 bfs에 조건 몇개만 추가 된 문제인데 꽤 오랜시간이 걸렸다.
이 문제를 통해 labmda를 사용해 정렬하는 방법을 배운것은 좋지만 이 정도 난이도는 조금더 빨리 풀 수 있어야 할 것 같다.