내 잡다한 노트

16236 아기상어 파이썬 본문

백준, 프로그래머스(파이썬)

16236 아기상어 파이썬

peanutwalnut 2022. 3. 9. 17:13

백준 아기상어 : https://www.acmicpc.net/problem/16236

 

16236번: 아기 상어

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

www.acmicpc.net

 

작성한 코드

import sys
from collections import deque

N = int(sys.stdin.readline().strip())
mapp = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]


def bfs(i, j, size):
    dist = [[-1] * N for _ in range(N)]
    q = deque()
    q.append((i, j))
    dist[i][j] = 0
    ans = []

    while q:
        x, y = q.popleft()
        for k in range(4):
            nx, ny = x+dx[k], y+dy[k]
            if 0 <= nx < N and 0<= ny < N and dist[nx][ny] == -1:
                move_ok = False
                eat = False
                if mapp[nx][ny] == 0:
                    move_ok = True
                elif size == mapp[nx][ny]:
                    move_ok = True
                elif size > mapp[nx][ny]:
                    move_ok = True
                    eat = True
                if move_ok:
                    q.append((nx, ny))
                    dist[nx][ny] = dist[x][y] +1
                    if eat:
                        ans.append((dist[nx][ny], nx, ny))
    if not ans:
        return None
    ans.sort()
    return ans[0]


shark_exp = 0
shark_size = 2
for i in range(N):
    for j in range(N):
        if mapp[i][j] == 9:
            x, y = i, j
            mapp[i][j] = 0

answer = 0
while True:
    fish = bfs(x, y, shark_size)
    if fish is None:
        break
    temp_dist, temp_x, temp_y = fish
    answer += temp_dist
    mapp[temp_x][temp_y] = 0
    shark_exp += 1
    if shark_size == shark_exp:
        shark_size += 1
        shark_exp = 0
    x, y = temp_x, temp_y
print(answer)


 

문제에 상어가 물고기를 먹으러 이동할 때 지나야하는 칸의 개수가 최소여야 한다고도 하고 상하좌우로 인접한

한 칸씩 이동한다고 하는걸 보니 BFS문제라고 생각이 들었다.

 

bfs로 가장 가까운 물고기를 먹고 그 물고기의 거리가 같으면 가장 위에 있는 물고기, 여러마리라면 왼쪽에 있는

물고기를 먹어야한다고해서 bfs에서 상어의 시작지점에서 bfs를 다 해주고 구한 ans값에 정렬을 한다

나중에 알고보니 가장 위에 있는 물고기, 그다음으로 왼쪽 물고기 이게 index로 정렬이 되면 딱 구현이 된다

상어가 물고기를 먹고 새롭게 먹은 자리에서 다시 bfs를 돌려주면서 거리를 계속 더해나가는 구조이다.

 

 

'백준, 프로그래머스(파이썬)' 카테고리의 다른 글

파이썬 백준 16724 피리부는 사나이  (0) 2022.04.03
6064 카잉 달력 파이썬  (0) 2022.03.28
10159 저울 [파이썬]  (0) 2022.03.23
2294 동전2 파이썬  (0) 2022.03.13
6087 레이저 통신 파이썬  (0) 2022.03.09