https://www.acmicpc.net/problem/7569
(입력 및 선언)
(익은 토마토 찾기)
(bfs 함수)
(최소 일수 구하기)
from collections import deque
m, n, h = map(int, input().split())
dy = [-1, 0, 1, 0, 0, 0]
dx = [0, 1, 0, -1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]
adjMatrix = []
bfsQueue = deque([])
visited = [[[0 for _ in range(m)] for _ in range(n)] for _ in range(h)]
cnt = 0
for i in range(h):
arr = []
for j in range(n):
arr.append(list(map(int, input().split())))
adjMatrix.append(arr)
def bfs():
while bfsQueue:
curY, curX, curZ = bfsQueue.popleft()
for i in range(6):
ny = curY + dy[i]
nx = curX + dx[i]
nz = curZ + dz[i]
if ny < 0 or nx < 0 or nz < 0 or ny >= h or nx >= n or nz >= m:
continue
if visited[ny][nx][nz] != 0:
continue
if adjMatrix[ny][nx][nz] != 0:
continue
bfsQueue.append((ny, nx, nz))
visited[ny][nx][nz] = 1
adjMatrix[ny][nx][nz] = adjMatrix[curY][curX][curZ] + 1
for i in range(h):
for j in range(n):
for k in range(m):
if adjMatrix[i][j][k] == 1 and visited[i][j][k] == 0:
bfsQueue.append((i, j, k))
visited[i][j][k] = 1
bfs()
for i in adjMatrix:
for j in i:
for k in j:
if k == 0:
print(-1)
exit()
cnt = max(cnt, max(j))
print(cnt-1)
list out of range 오류가 계속 났다.
처음에는 dy, dx를 5개, dz를 6개로 선언해서 안 맞았다. 방향이 여러 개로 늘어나니까 신경을 안 쓰고 지나가면 오류를 찾기가 까다로웠다.
이후에는 visited 배열의 크기를 잘못 설정했는데, 반복문과 헷갈려 h, m, n 순으로 만들었다. 직접 visited 배열을 출력하면서 해결했다.
그리고 bfs함수 안에 있는 첫 번째 if문 설정도 문제가 있었다. h <= ny < 0, n <= ny < 0, m <= nz <0으로 썼더니 계속 list out of range 오류가 났다. 그래서 하나씩 풀어 썼더니 고쳐졌다. 흠.. 뭐가 다르지