코딩,안되면 될때까지

[백준 7569번-토마토]-파이썬 본문

백준/백준-파이썬

[백준 7569번-토마토]-파이썬

soo97 2022. 4. 16. 18:38
728x90
반응형

solved.ac 난이도 :  GOLD4

백준     7569번- 파이썬 풀이

 

<문제>

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

 

7569번: 토마토

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

www.acmicpc.net

 

<풀이>-그래프이론,너비우선탐색,그래프 탐색

 

이 문제는 필자의 블로그에 있던 기존 토마토 문제에 좌표하나만 추가하면 된다. 즉 ,2차원 리스트를 사용하는 풀이에서 2차원 리스트를 3차원 리스트로만 바꿔주면 된다. 3차원리스트의 선언방법은 다음과 같다.

tomato1 = [[list(map(int,input().split())) for i in range(n)] for depth in range(h)]

자세한 풀이는 다음 링크를 참고하자

https://hae-sooo97.tistory.com/55

 

[백준 7576번-토마토]-파이썬

solved.ac 난이도 : GOLD5 백준 7576번- 파이썬 풀이 <문제> https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상..

hae-sooo97.tistory.com

<코드>-파이썬

from collections import deque

m,n,h = map(int,input().split())

tomato1 = [[list(map(int,input().split())) for i in range(n)] for depth in range(h)]

dx = [-1,0,1,0,0,0]
dy = [0,1,0,-1,0,0]
dh = [0,0,0,0,-1,1]
queue = deque()
for i in range(h):
    for j in range(n):
        for k in range(m):
            if tomato1[i][j][k]==1:
                queue.append([i,j,k])
while queue:
    z,x,y = queue.popleft()
    for i in range(6):
        nz = z+dh[i]
        nx = x+dx[i]
        ny = y+dy[i]
        if 0<=nx<n and 0<=ny<m and 0<=nz<h:
            if tomato1[nz][nx][ny]==0:
                tomato1[nz][nx][ny] = tomato1[z][x][y]+1
                queue.append([nz,nx,ny])


flag = False
for i in tomato1:
    for j in i:
        for k in j:
            if k == 0:
                flag = True
                break
            
if flag:
    print(-1)
else:
    max_value = 0
    for i in range(h):
        for j in range(n):
            for k in range(m):
                max_value = max(max_value,tomato1[i][j][k])
    print(max_value-1)

 

728x90
반응형
Comments