본문 바로가기
알고리즘/python

16236번 아기상어(python3)

by 펀구구 2022. 2. 6.

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

 

16236번: 아기 상어

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

www.acmicpc.net

아기상어 문제를 풀때 제일 중요한것은 bfs에서 방향을 지정해주는 것으로는 풀 수 없다는 것이다.

그래서 나는 먹을 수 있는 가장 가까운 물고기를 찾으면 queue안의 모든 물고기의 좌표를 비교하는 방법으로 문제를 해결했다.

from collections import deque
import sys

N = int(input())
data = []
visited = [[0] * N for _ in range(N)]
for i in range(N):
    a = sys.stdin.readline()
    data.append(list(map(int, a.split())))

shark_x = 0
shark_y = 0
for i in range(N):
    for j in range(N):
        if data[i][j] == 9:
            shark_x = i
            shark_y = j
big = 2
dx = [-1, 0, 0, 1]
dy = [0, -1, 1, 0]


def bfs(a, b):
    queue = deque()
    visited[a][b] = 1
    queue.append([a, b])
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < N:
                if visited[nx][ny] == 0 and 0 < data[nx][ny] < big:
                    real_x = nx
                    real_y = ny
                    while queue:
                        x2, y2 = queue.popleft()
                        for j in range(4):
                            nx2 = x2 + dx[j]
                            ny2 = y2 + dy[j]
                            if 0 <= nx2 < N and 0 <= ny2 < N:
                                if visited[nx2][ny2] == 0 and 0 < data[nx2][ny2] < big:
                                    if visited[x2][y2] < visited[x][y]:
                                        real_x = nx2
                                        real_y = ny2
                                        x = x2
                                        y = y2
                                    elif visited[x2][y2] == visited[x][y]:
                                        if real_x > nx2:
                                            real_y = ny2
                                            real_x = nx2
                                        elif real_x == nx2 and real_y > ny2:
                                            real_x = nx2
                                            real_y = ny2
                    visited[real_x][real_y] = visited[x][y] + 1
                    return [real_x, real_y]
                if visited[nx][ny] == 0 and data[nx][ny] == 0:
                    visited[nx][ny] = visited[x][y] + 1
                    queue.append([nx, ny])
                if visited[nx][ny] == 0 and data[nx][ny] == big:
                    visited[nx][ny] = visited[x][y] + 1
                    queue.append([nx, ny])
    return ["g", "g"]


count = 0
ans = 0
while True:
    visited = [[0] * N for _ in range(N)]
    before_x, before_y = shark_x, shark_y
    shark_x, shark_y = bfs(before_x, before_y)
    if shark_x == "g" and shark_y == "g":
        break
    else:
        ans = ans + visited[shark_x][shark_y] - 1
        data[before_x][before_y] = 0
        data[shark_x][shark_y] = 9
        count += 1
        if count == big:
            count = 0
            big += 1

print(ans)

 

해결은 했지만 복잡하게 푼 느낌이 있어서 인터넷을 참고해서 코드를 다시 짜볼 생각이다.

'알고리즘 > python' 카테고리의 다른 글

14888번 연산자 끼워넣기(python3)  (0) 2022.02.11
2573번 빙산(python3)  (0) 2022.02.06
2468번 안전 영역(python3)  (0) 2022.02.05
10026번 적록색약(python3)  (0) 2022.02.05
1904번 01타일(python3)  (0) 2022.02.02