본문 바로가기

알고리즘/삼성 기출

아기 상어 [백준 16236번]

문제

 

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

 

16236번: 아기 상어

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

www.acmicpc.net

 

내 풀이

 

bfs를 사용하여 아기 상어와 모든 물고기 간의 거리를 구하였다.

이동할 때 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없다는 조건을 고려하였다.

그러나 아기 상어가 먹을 수 있는 물고기 리스트인 fishes에 넣을 때에는 물고기의 크기가 아기 사어의 크기보다 작은지 확인하였다. 같으면 fishes에 들어갈 수 없기 때문이다.

 

fishes를 조건에 따라 정렬하였다.

거리가 가까운 물고기부터 -> 가장 위에 있는 물고기부터 -> 가장 왼쪽에 있는 물고기부터

 

그리고 fishes에서 물고기를 한 마리 꺼낸 후 아기 상어의 크기를 조정할 수 있으면 조정해주었다.

 

마지막으로 시간을 구해야 하는데, 여기서 정신을 똑바로 차려야 한다.

time에는 1초가 아닌, 아기 상어와 물고기 사이의 거리(=초)를 더해주어야 한다.

 

from collections import  deque
N = int(input())
bowl = []
sx, sy = 0, 0
for i in range(N):
    arr = list(map(int, input().strip().split()))
    bowl.append(arr)
    for j in range(N):
        if arr[j] == 9:
            sx, sy = i, j
bowl[sx][sy] = 0
shark_size = 2
cnt = 0
dx, dy = [-1, 1, 0, 0], [0, 0, 1, -1]
def bfs(x, y):
    global sx, sy, cnt, shark_size
    dist = [[-1] * N for _ in range(N)]
    fishes = []
    q = deque()
    q.append((x, y))
    dist[x][y] = 0
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx, ny = x+dx[i], y+dy[i]
            if 0<=nx<N and 0<=ny<N:
                if dist[nx][ny] == -1 and bowl[nx][ny] <= shark_size:
                    dist[nx][ny] = dist[x][y] + 1
                    q.append((nx, ny))
                    if 0 < bowl[nx][ny] < shark_size:
                        fishes.append(((nx, ny), dist[nx][ny]))
    fishes.sort(key=lambda x:(x[1], x[0][0], x[0][1]))
    if fishes:
        pos, d = fishes.pop(0)
        fx, fy = pos
        sx, sy = fx, fy
        bowl[fx][fy] = 0
        cnt += 1
        if cnt == shark_size:
            shark_size += 1
            cnt = 0
        return d
    else:
        return -1
time = 0
while True:
    d_time = bfs(sx, sy)
    if d_time == -1:
        break
    else:
        time += d_time
print(time)

 

총평

삼며든다...

'알고리즘 > 삼성 기출' 카테고리의 다른 글

게리맨더링 2 [백준 17779번]  (0) 2022.10.10
톱니바퀴 [백준 14891번]  (0) 2022.10.09
나무 재테크 [백준 16235번]  (1) 2022.10.08
경사로 [백준 14890번]  (1) 2022.10.08
연구소 3 [백준 17142번]  (0) 2022.10.08