https://www.acmicpc.net/problem/16236
16236번: 아기 상어
N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가
www.acmicpc.net
내 풀이
from collections import deque
import sys
INF = 10**8
input = sys.stdin.readline
def solution():
K = int(input())
graph = [list(map(int,input().split())) for _ in range(K)]
dx = [1,-1,0,0]
dy = [0,0,1,-1]
shark = 2
now_x,now_y=0,0
for i in range(K):
for j in range(K):
if graph[i][j]==9:
now_x,now_y = i,j
graph[now_x][now_y] = 0
def bfs():
dist = [[-1] * K for _ in range(K)]
q = deque([(now_x,now_y)])
dist[now_x][now_y]=0
while q:
a,b = q.popleft()
for i in range(4):
nx = dx[i] + a
ny = dy[i] + b
if 0<=nx <K and 0<=ny <K:
if dist[nx][ny] == -1 and graph[nx][ny] <= shark:
dist[nx][ny] = dist[a][b] + 1
q.append((nx,ny))
return dist
def find(dist):
x,y=0,0
min_dist=INF
for i in range(K):
for j in range(K):
if dist[i][j] != -1 and 1<= graph[i][j] <shark:
if dist[i][j] < min_dist:
x,y = i,j
min_dist = dist[i][j]
if min_dist == INF:
return None
else:
return x,y,min_dist
result =0
ate = 0
while True:
value = find(bfs())
if value == None:
print(result)
break
else:
now_x,now_y = value[0],value[1]
result += value[2]
graph[now_x][now_y]=0
ate +=1
if ate >= shark:
shark +=1
ate = 0
solution()
다른 사람들의 풀이를 보니까 정렬을 했던데, 사실 그럴 필요가 없다고 생각했다. 왜냐면 애초에 최단 거리 테이블을 제공하면 되기때문이다.
bfs로 최단 거리 테이블을 제공, find함수로 가장 가까운 물고기 1마리를 선택하면 된다.
True 인동안 최단 거리에 있는 물고기를 계속해서 탐색하면 될일이다.
시간 초과의 위험역시 먹을 물고기가 없는 경우에는 바로 함수가 종료되므로 걱정할 일이 없다.
다른사람의 풀이
from collections import deque
n = int(input())
s_x, s_y = -1, -1
s_level, eat = 2, 0
graph = []
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(n):
data = list(map(int, input().split()))
graph.append(data)
for j in range(n):
if data[j] == 9:
s_x, s_y = i, j
graph[s_x][s_y] = 0
def bfs(s_x, s_y, s_level):
visited = [[False]*n for _ in range(n)]
q = deque()
q.append((s_x, s_y, 0))
visited[s_x][s_y] = True
fish = []
while q:
x, y, count = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
visited[nx][ny] = True
if graph[nx][ny] != 0 and graph[nx][ny] < s_level:
fish.append((count+1, nx, ny))
q.append((nx, ny, count+1))
visited[nx][ny] = True
elif graph[nx][ny] == 0 or graph[nx][ny] == s_level:
visited[nx][ny] = True
q.append((nx, ny, count+1))
fish.sort()
if fish:
return [fish[0][1], fish[0][2], fish[0][0]]
else:
return []
answer = 0
while True:
fish_eat = bfs(s_x, s_y, s_level)
if fish_eat:
x, y, move = fish_eat
graph[x][y] = 0
eat += 1
answer += move
if eat == s_level:
s_level += 1
eat = 0
s_x, s_y = x, y
else:
break
print(answer)
'취준 > 백준' 카테고리의 다른 글
2468 - 파이썬 (0) | 2022.08.16 |
---|---|
14502 - 파이썬 (0) | 2022.08.03 |
1707 - 파이썬 (0) | 2022.08.02 |
16928 - 파이썬 (0) | 2022.08.01 |
1504 - 파이썬 (0) | 2022.07.27 |