본문 바로가기
코딩/백준-파이썬

백준 16236번: 아기상어

by 철없는민물장어 2022. 7. 25.
728x90
반응형
from collections import deque


n=int(input())
graph=[]
for i in range(n):
    graph.append(list(map(int,input().split())))

for i in range(n):
    for j in range(n):
        if graph[i][j]==9: #아기상어의 위치
            shark_x,shark_y=i,j #아기상어의 위치 저장
            graph[i][j]=0 #빈칸으로 변경

level=2


dx=[1,-1,0,0]
dy=[0,0,1,-1]
def bfs(x,y,level):
    visited=[[0]*n for i in range(n)]
    dist=[[0]*n for i in range(n)]
    queue=deque()
    queue.append((x,y))
    
    visited[x][y]=1 #방문표시
    fish=[]
    while queue:
        x,y=queue.popleft()
        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 graph[nx][ny]<=level and visited[nx][ny]==0: #상어가 이동가능한 경우
                queue.append((nx,ny))
                visited[nx][ny]=1
                dist[nx][ny]=dist[x][y]+1
                if graph[nx][ny]<level and graph[nx][ny]>0: #물고기일 때
                    fish.append((nx,ny,dist[nx][ny]))
    visited=[[0]*n for i in range(n)]
    return sorted(fish,key=lambda x:(-x[2],-x[0],-x[1])) #거리, 윗쪽, 왼쪽 순 정렬


count=0
result=0
exp=0
while True:
    shark=bfs(shark_x,shark_y,level) #bfs함수로 먹을 수 있는 물고기의 위치,거리를 받음
    if len(shark)==0: #먹을 물고기가 없는 경우 중단
        break

    nx,ny,dist=shark.pop() #먹을 물고기의 위치,거리를 nx,ny,dist에 담음

    result+=dist #총 걸린 시간에 거리만큼 더함
    graph[shark_x][shark_y],graph[nx][ny]=0,0 #먹은 물고기 위치를 0으로 변경
    shark_x,shark_y=nx,ny #현재위치를 물고기를 먹은 위치로 변경

    exp+=1
    if exp==level:
        level+=1
        exp=0

print(result)

...

728x90
반응형

'코딩 > 백준-파이썬' 카테고리의 다른 글

백준 16234번: 인구 이동  (0) 2022.07.26
백준 1654번: 랜선 자르기  (0) 2022.07.25
백준 16236번: 아기상어 (실패)  (0) 2022.07.25
백준 2470번: 두 용액  (0) 2022.07.21
백준 11726번: 2xN 타일링  (0) 2022.07.21

댓글