티스토리 뷰
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
문제 풀이
이번 문제는 7576번 문제를 3차원으로 생각하여 풀면 되는 문제이다.
import sys
from collections import deque
input = sys.stdin.readline
m, n, h = map(int, input().split())
graph = [[list(map(int, input().split())) for _ in range(n)] for _ in range(h)]
visited = [[[False]*m for _ in range(n)] for _ in range(h)]
queue = deque()
dx = [-1,1,0,0,0,0]
dy = [0,0,-1,1,0,0]
dz = [0,0,0,0,-1,1]
answer = 0
def bfs():
while queue:
x,y,z = queue.popleft()
for i in range(6):
nx = x + dx[i]
ny = y + dy[i]
nz = z + dz[i]
if nx < 0 or nx >= h or ny < 0 or ny >= n or nz < 0 or nz >= m:
continue
if graph[nx][ny][nz] == 0 and visited[nx][ny][nz] == False:
queue.append((nx,ny,nz))
graph[nx][ny][nz] = graph[x][y][z] + 1
visited[nx][ny][nz] = True
for a in range(h):
for b in range(n):
for c in range(m):
if graph[a][b][c] == 1 and visited[a][b][c] == 0:
queue.append((a,b,c))
visited[a][b][c] = True
bfs()
for a in graph:
for b in a:
for c in b:
if c == 0:
print(-1)
exit(0) # break를 쓰면 반복문 하나만 탈출하기에 exit(0)으로 종료.
answer = max(answer, max(b))
print(answer-1)
2차원에서 3차원으로 바꾸는 간단한 응용이었지만 시간이 좀 걸렸다. 3차원 형태에서 탐색을 진행한 것은 처음이었는데 다음번에 유사한 문제가 나온다면 참고해도 좋을 듯 하다.
'알고리즘' 카테고리의 다른 글
백준 18352 - 파이썬 (0) | 2023.05.09 |
---|---|
백준 14502 - 파이썬 (0) | 2023.05.08 |
백준 1697 - 파이썬 (0) | 2023.05.05 |
백준 7576 - 파이썬 (0) | 2023.04.30 |
백준 1012 - 파이썬 (0) | 2023.04.29 |
댓글