Algorithm Study/Python

[백준 파이썬] # 7569 토마토

728x90
반응형

Silver I

# 7569 토마토

링크 : https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

풀이

M, N, H = map(int, input().split())
house = []
floor = []

for k in range(H):
    floor = [list(map(int, input().split())) for i in range(N)]
    house.append(floor)

##

from collections import deque

def bfs(graph):
    queue = deque()

    for k in range(H):
        for j in range(N):
            for i in range(M):
                if house[k][j][i] == 1:
                    queue.append((i, j, k))

    dx = [0,0,-1,1,0,0]
    dy = [1,-1,0,0,0,0]
    dz = [0,0,0,0,1,-1]

    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 0<=nx<M and 0<=ny<N and 0<=nz<H:
                if house[nz][ny][nx] == 0:
                    queue.append((nx, ny, nz))
                    house[nz][ny][nx] = house[z][y][x] + 1
    return graph

##

li = []

for i in bfs(house):
    for j in i:
        if 0 in j:
            li.append(0)
        else:
            li.append(max(j))


if 0 in li:
    print(-1)
else:
    print(max(li)-1)

 

풀이 방법

세 부분으로 나누어서 풀이했다 ('##' 으로 구분 )

  • 기본 입력
  • bfs 정의
  • 정답 출력을 위한 코드

 

풀이 후기

  • 이전 토마토 문제에서 3차원 개념, 6 방향 탐색이 추가되었다
  • 중간중간 풀이 방향을 잃지 않는다면 충분히 풀 수 있었다