링크 : https://www.acmicpc.net/problem/2116
주사위의 반대편 인덱스를 미리 저장해 둠으로 써,
매번 인접한 칸의 인덱스를 구할 필요없이 바로 접근 가능함을 알 수 있었던 문제
소스코드 (Implement)
import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader
private var N = 0 // 주사위의 개수 (10,000개 이하)
private const val DICE_SIZE = 6
private lateinit var diceList: Array<IntArray>
private val opSideIndexList = arrayOf(5, 3, 4, 1, 2, 0) //주사위의 반대편쪽 인덱스 저장
private var tempSum = 0
private var answer = 0
private fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
N = br.readLine().toInt()
diceList = Array(N) { IntArray(DICE_SIZE) { 0 } }
repeat(N) { i ->
diceList[i] = br.readLine().split(" ").map { it.toInt() }.toIntArray()
}
diceList[0].forEach { firstTop ->
tempSum += getHorizontalMaxNum(0, firstTop)
stackDice(1, firstTop)
tempSum = 0
}
println(answer)
//윗면, 아랫면 도킹을 한 후, 돌릴 수 있는 수 중 가장 큰 수 찾아서 더하기
}
private fun stackDice(floor: Int, bottomTop :Int){
if (floor == N) {
answer = maxOf(tempSum, answer)
return
}
tempSum += getHorizontalMaxNum(floor, bottomTop)
stackDice(floor+1, getTopNum(floor, bottomTop))
}
private fun getHorizontalMaxNum(floor: Int, bottomOrTopNum: Int) :Int{
val targetNumIndex = diceList[floor].indexOfFirst { it == bottomOrTopNum }
var max = Int.MIN_VALUE
for (i in 0 until DICE_SIZE){
if (i == targetNumIndex || i == opSideIndexList[targetNumIndex]) continue
max = maxOf(diceList[floor][i], max)
}
return max
}
private fun getTopNum(floor: Int, bottomNum: Int) :Int{
val bottomNumIndex = diceList[floor].indexOfFirst { it == bottomNum }
return diceList[floor][opSideIndexList[bottomNumIndex]]
}
'Algorithm_Kotlin' 카테고리의 다른 글
[Kotlin] BOJ2573 빙산 (0) | 2023.04.06 |
---|---|
[Kotlin] BOJ2636 치즈 (0) | 2023.04.05 |
[Kotlin] BOJ1966 프린터 큐 (1) | 2023.03.10 |
[Kotlin] BOJ1913 달팽이 (0) | 2023.03.09 |
[Kotlin] BOJ1063 킹 (1) | 2023.03.06 |