본문 바로가기
Algorithm/백준 문제풀이

[python] 7569번 - 토마토

by B_Tori 2021. 12. 12.

문제

파이썬 풀이

해당 문제는 이전 문제인 7576토마토 문제가 3차원으로 변형된 문제이다.

2차원 탐색이였을 때 가졌던 이동 변수인 dx, dy에 dz를 추가하여 좌, 우, 앞, 뒤, 위, 6가지 이동을 할 수 있도록 해주면 될 것 같다.

3차원 탐색 BFS

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

def bfs() :

    while q :
        x, y, z = q.popleft()
        for i in range(6) :
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]

            if nx < 0 or nx >= n or ny < 0 or ny >= m or nz < 0 or nz >= h :
                continue
            if matrix[nz][nx][ny] == -1 :
                continue
            if matrix[nz][nx][ny] == 0 :
                matrix[nz][nx][ny] = matrix[z][x][y] + 1
                q.append((nx,ny,nz))

좌, 우, 앞, 뒤, 위, 아래 6가지 이동을 하기 위해 이동 변수의 길이도 6이 되었고, z축 이동을 위한 dz 변수도 추가해주었다.

이동 변수들과 이동 for문이 리스트 길이에 맞춰6이 된점, matrix가 3차원인 것만 빼면 이전 문제와 동일하다.

 

기본적인 로직에 대한 설명은 이전 문제와 동일하다.

이전 문제 풀이 : https://bang-tori.tistory.com/24

 

[python] 7576번 - 토마토

문제 파이썬 풀이 최소 날짜를 구하기 위해서 BFS를 사용하고, 탐색을 할 때마다 이전 탐색 지점 + 1을 값으로 저장해주어 날짜를 저장해준다. 즉 마지막에 탐색하는 칸에는 가장 큰 값이 들어 있

bang-tori.tistory.com

 

전체 코드

from collections import deque
import sys
input = sys.stdin.readline

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

m, n, h = map(int, input().rstrip().split())
matrix = [[list(map(int, input().rstrip().split())) for _ in range(n)] for _ in range(h)]

q = deque()

def bfs() :

    while q :
        x, y, z = q.popleft()
        for i in range(6) :
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]

            if nx < 0 or nx >= n or ny < 0 or ny >= m or nz < 0 or nz >= h :
                continue
            if matrix[nz][nx][ny] == -1 :
                continue
            if matrix[nz][nx][ny] == 0 :
                matrix[nz][nx][ny] = matrix[z][x][y] + 1
                q.append((nx,ny,nz))

for z in range(h) :
    for i in range(n) :
        for j in range(m) :
            if matrix[z][i][j] == 1 :
                q.append((i,j,z))
bfs()
for l2 in matrix :
    for l in l2 :
        if 0 in l :
            print(-1)
            sys.exit()
result = 0
for i in matrix :
    for j in i :
        list_max = max(j)
        result = max(result, list_max)

print(result - 1)

이전 풀이와 조금 다른 점은 -1을 출력하는 부분에서 result에 값을 넣는 대신 출력을 하고 프로그램을 끝내도록 하였고,

max값을 찾는 부분을 map이 아닌 반복문을 통해 구현했다는 점이다.

댓글