링크 : https://www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net

주사위의 반대편 인덱스를 미리 저장해 둠으로 써,

매번 인접한 칸의 인덱스를 구할 필요없이 바로 접근 가능함을 알 수 있었던 문제

 


소스코드 (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