https://www.acmicpc.net/problem/7569
2차원을 풀어보면 쉽다고 생각하고 접근했지만 다소 까다로운 면이 있었다.
파이썬에서 3차원 배열을 처음 써봤기 때문에, 인덱스로 뭘 던져야 할지 아예 모르겠더라..
다행히, 무식하게 dx dy dz 난사를 하니 해결이 됐다.
import sys
from collections import deque
input = sys.stdin.readline
garo, sero, tall = map(int, input().split())
box = [[[0 for col in range(garo)] for row in range(sero)] for depth in range(tall)]
dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]
for i in range(tall):
for j in range(sero):
box[i][j] = list(map(int, input().split()))[:garo]
# 가로 세로 층 입력 받고 나면
# [층][행][열] 순으로 접근 한다고 알려져있다.
# box[z][x][y]
# 전체 순회 돌면서 사전에 존재하는 모든 1에 대해 시도
def BFS():
while q:
item = q.popleft()
day = box[item[0]][item[1]][item[2]] + 1
# i가 floor, j가 세로, k가 가로이다.
# 이 상태에서 i[0] == floor | i[1] == sero
for i in range(6):
nZ = item[0] + dx[i]
nY = item[1] + dy[i]
nX = item[2] + dz[i]
# x, y, z | 행, 열, 높이
if(nX < 0 or nX >= garo or nY < 0 or nY >= sero or nZ < 0 or nZ >= tall):
continue
if(str(box[nZ][nY][nX]) != '0'):
# 목표는 0이니 0만 찾게 한다.
continue
box[nZ][nY][nX] = day
# 값 비교가 필요하겠는데?
q.append([nZ, nY, nX])
q = deque()
# BFS
for i in range(tall):
for j in range(sero):
for k in range(garo):
if(str(box[i][j][k]) == '1'):
# 이거 입력 문자열|숫자 여부 잘 봐야함
q.append([i, j, k])
# i가 floor, j가 세로, k가 가로이다.
# 이거 보고나서 BFS 코드 관찰
BFS()
maxValue = 0
isEdible = True
for i in range(tall):
for j in range(sero):
for k in range(garo):
if(str(box[i][j][k]) == '0'):
isEdible = False
maxValue = max(maxValue, int(box[i][j][k]))
if(isEdible):
print(str(maxValue - 1))
else:
print("-1")
'문제풀이' 카테고리의 다른 글
[PY] 14888 : 연산자 끼워넣기 (0) | 2025.04.01 |
---|---|
[PY] <!> 1707 : 이분 그래프 (0) | 2025.04.01 |
[PY] 2718 : 미로 찾기 (0) | 2025.03.31 |
[PY] 21606 : 아침 산책 (0) | 2025.03.31 |
[PY] 11725 : 트리의 부모 찾기 (0) | 2025.03.31 |