
이전 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()
}