BOJ 7569 토마토

LONGNEW·2021년 3월 28일
0

BOJ

목록 보기
214/333

https://www.acmicpc.net/problem/7569
시간 1초, 메모리 256MB
input :

  • M, N, H | M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수, H는 상자의 수.. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100
  • 상자 가로줄에 들어있는 토마토들의 상태가 M개의 정수로 주어진다.
  • 정수 1은 익은 토마토, 정수 0 은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

output :

  • 토마토가 모두 익을 때까지 최소 며칠이 걸리는지를 계산해서 출력해야 한다.
  • 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력

조건 :

  • 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미

일단 2차원 배열을 받아서 이 상자를 H개 쌓아서 3차원 배열을 만드는 것이다

graph = [[list(map(int, sys.stdin.readline().split())) for i in range(n)] for j in range(h)]

n번 입력을 받음으로, 배열 내부에서 2차원 배열을 만들고 이를 h번 반복하는 것.

그외의 경우는 기본 bfs와 동일하다.
그리고 3차원 배열을 탐색할 때에는 graph[nz][nx][ny] 순서로, z축, x축, y축 순서이다. 잊지말자.

최소 일수를 구해야 하니, 계속 업데이트를 해줘야 한다.

while q:
    z, x, y, day = 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 graph[nz][nx][ny] == 0:
            graph[nz][nx][ny] = 1
            q.append((nz, nx, ny, day + 1))
            
    ans = max(ans, day)

그리고 마지막에 이 배열에 아직익지 않은 토마토(0)가 존재하는지 확인해 주어야 한다.

for z in range(h):
    for x in range(n):
        for y in range(m):
            if graph[z][x][y] == 0:
                ans = -1

0개의 댓글