[백준] 7569 - 토마토

오규성·2025년 10월 23일

이전 7576-토마토 문제의 2차원 배열을 3차원 배열로 늘린 문제이다.
x축, y축에 z축까지 추가하여 계산해주면 끝나는 문제이므로, 이전 문제에서 BFS를 활용하여 풀어봤다면 그다지 어렵지 않게 풀 수 있다.

풀이

import java.util.StringTokenizer

fun main(){ `7569-토마토`() }

/*
* 인접 = dx, dy, dz 3가지 변수 사용
*
* 첫 줄에 상자의 크기 M, N 과 상자의 수 H
* M = 가로 칸 수 (col), N = 세로 칸 수 (row)
* M,N,H = 2 ~ 100
*
* 1 - 익토, 0 - 안익토, -1 - 안넣음
*
* 상자에 저장되자마자 모든 토마토가 익어있으면 0.
* 나중에 모두 익히지 못하면 -1
* 아니면 걸리는 시간 출력
* */
private const val IS_RIPE = 1
private const val IS_NOT_RIPE = 0
private const val IS_NOT_EXIST = -1
private val arrayDeque = ArrayDeque<Triple<Int, Int, Int>>()
private lateinit var tomatoBoxArr: Array<Array<IntArray>>
private var boxInTomatoCount = 0
private val dz = intArrayOf(-1, 1, 0, 0, 0, 0)
private val dx = intArrayOf(0, 0, -1, 1, 0, 0)
private val dy = intArrayOf(0, 0, 0, 0, -1, 1)
private var col = 0
private var row = 0
private var zIndex = 0
private var printDay = 0

fun `7569-토마토`(){
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()
    val directToken = StringTokenizer(br.readLine())
    col = directToken.nextToken().toInt()
    row = directToken.nextToken().toInt()
    zIndex = directToken.nextToken().toInt()

    tomatoBoxArr = Array(zIndex){ z ->
        Array(row){ i ->
            val tomatoToken = StringTokenizer(br.readLine())
            IntArray(col){ j ->
                val tomato = tomatoToken.nextToken().toInt()
                if(tomato == IS_RIPE) arrayDeque.addLast(Triple(z, i, j))
                if(tomato != IS_NOT_EXIST) boxInTomatoCount++
                tomato
            }
        }
    }

    if(arrayDeque.size == boxInTomatoCount){
        bw.write("0")
        bw.flush()
        bw.close()
        br.close()
        return
    }

    while(arrayDeque.isNotEmpty()){
        val location = arrayDeque.removeFirst()
        val z = location.first
        val x = location.second
        val y = location.third
        // 익었으므로 출하했다고 가정
        boxInTomatoCount--

        for(i in 0 until 6){
            val nz = z + dz[i]
            val nx = x + dx[i]
            val ny = y + dy[i]

            if(nz !in 0 until zIndex || nx !in 0 until row || ny !in 0 until col) continue
            if(tomatoBoxArr[nz][nx][ny] == IS_NOT_RIPE){
                tomatoBoxArr[nz][nx][ny] = tomatoBoxArr[z][x][y] + 1
                // 1이 익은것. 안익은것 0을 1 + 1 해서 2로 만들었으니, 날짜는 -1 해야 정상이다.
                printDay = maxOf(printDay, tomatoBoxArr[nz][nx][ny] - 1)
                arrayDeque.addLast(Triple(nz, nx, ny))
            }
        }
    }

    // 출하되지 못한 토마토가 존재하므로 -1 출력해야한다.
    if(boxInTomatoCount > 0){
        bw.write("-1")
    } else {
        bw.write("$printDay")
    }

    bw.flush()
    bw.close()
    br.close()
}
profile
안드로이드 개발자 Gyu 의 개발 블로그 !

0개의 댓글