상세 컨텐츠

본문 제목

[백준 7569번 ] 토마토 2(파이썬)

알고리즘 공부

by Tabris4547 2022. 6. 30. 13:54

본문

728x90

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

 

7569번: 토마토

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

www.acmicpc.net

2022.06.22 - [알고리즘 공부] - [백준 7576] 토마토(파이썬)

 

[백준 7576] 토마토(파이썬)

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다...

door-of-tabris.tistory.com

이 문제는 토마토 문제랑 완전 같은 문제입니다.

"같은 걸 왜 다시 올리나요? 날먹하시나요?"

하실 수 있는데요.

다른 점이 하나 있죠.

이 문제는 3차원 배열을 써야한다는 사실.

bfs를 쓰면 쉬운 문제이지만

3차원 배열을 다루는 것에 익숙하지 않는 저는

처음에 고생을 많이 했었습니다.

 

#백준 7569번 토마토2
from collections import deque

M,N,H=map(int,input().split())

visited=[[[-1]*M for _ in range(N)] for _ in range(H)]

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


tomato=deque()
for h in range(H):
    for i in range(N):
        data=list(map(int,input().split()))

        for j in range(M):
            if data[j]==1:
                visited[h][i][j]=0
                tomato.append([i,j,h])
            if data[j]==-1:
                visited[h][i][j]=-2

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

        if nx<0 or nx>=N or ny<0 or ny>=M or nz<0 or nz>=H:
            continue

        if not visited[nz][nx][ny]==-1:
            continue

        tomato.append([nx,ny,nz])
        visited[nz][nx][ny]=visited[z][x][y]+1

answer=0
not_in=False
for h in range(H):
    for i in range(N):
        for j in range(M):
            answer=max(answer,visited[h][i][j])

            if visited[h][i][j]==-1:
                not_in=True

if not_in==True:
    print(-1)
else:
    print(answer)

 

 

 

리스트의 3차원 활용에 대해서 

따로 정리해서 생각해봄직한 문제입니다.

 

728x90

관련글 더보기

댓글 영역