알고리즘

[ 알고리즘 ] 아기상어 - bfs

j9972 2024. 3. 21. 16:26
728x90

문제

https://www.acmicpc.net/problem/16236

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

 

풀이 팁

1. 처음에 작성한 코드는 먹을 수 있는 물고기들을 매번 구하면서 가장 가까우며, 혹은 가장 위 / 가장 왼쪽 기준으로 선택하여 한번에 거리들을 구하는 방식으로 갔다.. ( 아직도 왜 틀린지를 모르겠지만, 계속 틀려서 수정 -> 아시는 분은 댓글 부탁드려요 ㅠ )
https://www.acmicpc.net/board/view/139274

 

글 읽기 - 왜 틀렸을까요??

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

2. 결국 방문자 처리와 거리를 하나씩 더해가는 식의 방식으로 구현을 했다.

코드

import sys
from collections import deque

n = int(input())
arr = [
    list(map(int,input().split()))
    for _ in range(n)
]

cnt ,time, size = 0, 0, 2 

dxs,dys =[-1,0,1,0], [0,-1,0,1]

visited = [
    [False for _ in range(n)]
    for _ in range(n)
]

cur_x, cur_y = 0,0
for i in range(n):
    for j in range(n):
        if arr[i][j] == 9:
            arr[i][j] = 0
            cur_x, cur_y = i,j

def in_range(x,y):
    return 0<=x<n and 0<=y<n

def init_visited():
    for i in range(n):
        for j in range(n):
            visited[i][j] = False

def can_go(x,y):
    return in_range(x,y) and arr[x][y] <= size and not visited[x][y]

def can_eat(x,y):
    return arr[x][y] != 0 and arr[x][y] < size

def bfs():
    global cur_x, cur_y, size

    dist = [
        [0 for _ in range(n)]
        for _ in range(n)
    ]

    init_visited()

    q = deque()
    q.append((cur_x, cur_y))

    visited[cur_x][cur_y] = True
    eat_fishes = []

    while q:
        x,y = q.popleft()

        for dx,dy in zip(dxs, dys):
            nx,ny = x +dx , y +dy

            if can_go(nx,ny):
                visited[nx][ny] = True
                q.append((nx,ny))
                dist[nx][ny] = dist[x][y] + 1

                if can_eat(nx,ny):
                    eat_fishes.append((nx,ny, dist[nx][ny]))

    return sorted(eat_fishes, key=lambda x : (-x[2],-x[0],-x[1]))

while True:
    ate_fishes = bfs()

    if len(ate_fishes) == 0:
        break

    next_x,next_y,distance = ate_fishes.pop()

    time += distance
    arr[next_x][next_y] = 0

    cur_x,cur_y = next_x,next_y
    cnt += 1
    
    if cnt >= size:
        size += 1
        cnt = 0

print(time)