
- 구현 문제 너무 어렵다 디버깅할 때 시간이 너무 오래 걸림
 
import sys
from collections import deque
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def enable_fish(visit):
	global shark_size
	min_distance = 1e9
	x, y = 0, 0
	for i in range(N):
		for j in range(N):
			if visit[i][j] != -1 and 1 <= Map[i][j] < shark_size:
				if visit[i][j] < min_distance:
					min_distance = visit[i][j]
					x, y = i, j
	if min_distance == 1e9: 
		return -1
	else:
		return x, y, min_distance
def move():
	global shark_position_x; global shark_position_y
	global shark_size
	queue = deque([])
	queue.append([shark_position_x, shark_position_y])
	visit = [[-1] * N for n in range(N)]
	visit[shark_position_x][shark_position_y] = 0
	while queue:
		tmp = queue.popleft(); x = tmp[0]; y = tmp[1]
		for i in range(4):
			nx = x + dx[i]; ny = y + dy[i]
			if nx < 0 or ny < 0 or nx >= N or ny >= N:
				continue
			
			if visit[nx][ny] == -1:
				if Map[nx][ny] <= shark_size:
					visit[nx][ny] = visit[x][y] + 1
					queue.append([nx, ny])
	
	return visit
				
N = int(input())
Map = []
for _ in range(N):
	Map.append(list(map(int, sys.stdin.readline()[:-1].split())))
shark_position_x = -1; shark_position_y = -1 
for i in range(N):
	for j in range(N):
		if Map[i][j] == 9:
			shark_position_x = i; shark_position_y = j
			Map[shark_position_x][shark_position_y] = 0
			break
shark_size = 2 
shark_current_eat = 0 
answer = 0 
while True:
	result = enable_fish(move())
	if result == -1:
		print(answer)
		break
	else:
		shark_position_x = result[0]; shark_position_y = result[1]
		answer += result[2]
		Map[shark_position_x][shark_position_y] = 0
		shark_current_eat += 1
		if shark_current_eat == shark_size:
			shark_size += 1
			shark_current_eat = 0
전역 변수
- shark_position_x, shark_position_y는 상어의 현재 위치
 
- shark_size는 상어의 현재 크기
 
- shark_current_eat은 상어가 현재 크기에서 먹은 물고기의 개수
 
- answer는 상어가 지금까지 이동한 거리
 
전반적인 구현 흐름
- while문을 돌면서, enable_fish()를 호출해줌. enable_fish 함수의 결과값이 -1이 반환되었다면 더이상 먹을 수 있는 물고기가 없는 경우니까 answer 출력
 
- enable_fish()의 반환값이 상어가 먹은 물고기의 좌표와 그 물고기를 먹는데 까지 걸린 시간이라면 상어의 현재 위치(shark_position_x, shark_position_y), 상어의 현재 크기(shark_size), 상어가 현재 크기에서 먹은 물고기의 개수(shark_current_eat), 상어가 지금까지 이동한 거리(answer)를 update 해줌
 
move()
- 상어의 현재 위치를 기준으로 도달할 수 있는 최단 거리에 대한 정보가 모두 들어있는 visit 리스트를 결과값으로 반환해줌
 
enable_fish()
- move()의 결과값인 visit 리스트를 기반으로 상어가 먹은 물고기(문제 조건에 맞는)의 위치와 그 물고기를 먹는데 까지 걸린 시간을 반환해줌

 
- enable_fish()에선 (0, 0)부터 순회하기 때문에, 상어가 최단거리이자 가장 위, 가장 왼쪽에 있는 물고기를 먹게 됨