티스토리 뷰

알고리즘

백준 7569 - 파이썬

취뽀가자!! 2023. 5. 7. 23:11

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함