(Kotlin) 롤링 BOJ14499 주사위

협회: https://www.acmicpc.net/problem/14499

#14499: 주사위 굴리기

첫 번째 줄, 지도의 세로 크기 N, 가로 크기 M(1≤N, M≤20), 주사위의 위치 좌표 x, y(0≤x≤N-1, 0≤y ≤ M-1) 및 주어진 명령 수 K(1 ≤ K ≤ 1,000).두 번째 라인에서 N 라인까지

www.acmicpc.net

문제는 지문을 이해하기 어렵다는 점이다.

주어진 개발 지도에 적힌 숫자를 주사위의 절대 위치(인덱스)로 취급

해당 인덱스에서 주사위 값을 포함하는 배열을 만들고,

주사위를 굴릴 때마다 주사위의 숫자가 업데이트됩니다.

//1 : 위
//2 : 북
//3 : 동
//4 : 서
//5 : 남
//6 : 바닥



소스 코드(구현)


import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader

private var N = 0 //세로 크기 N (1 ≤ N, M ≤ 20)
private var M = 0 //가로 크기 M
private var x = 0 //주사위를 놓은 곳의 row좌표 (0 ≤ x ≤ N-1)
private var y = 0 //주사위를 놓은 곳의 col좌표(0 ≤ y ≤ M-1)
private var K = 0 //명령의 개수 (1 ≤ K ≤ 1,000)
private lateinit var board: Array<IntArray>
private var diceNum = Array(6) { 0 }
private val MX = arrayOf(0, 0, -1, 1) //동서북남
private val MY = arrayOf(1, -1, 0, 0) //동서북남

private fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    br.readLine().split(" ").map { it.toInt() }.apply {
        N = this(0)
        M = this(1)
        x = this(2)
        y = this(3)
        K = this(4)
    }
    board = Array(N) { br.readLine().split(" ").map { it.toInt() }.toIntArray() }

    br.readLine().split(" ").map { it.toInt() }
        .forEach { moveDice(it) }
}

private fun moveDice(direction: Int) {
    val newX = x + MX(direction - 1)
    val newY = y + MY(direction - 1)
    if (!
isInMap(newX, newY)) return //방향에 따라 굴렸을때 숫자를 옮겨야 하는 위치(주어진 전개도 번호)가 다름으로 //굴리는 방향에 따라 주사위에 적혀있는 숫자를 옮기는 로직 분기 val newDiceNum = diceNum.copyOf() when (direction) { 1 -> { //동 //위(1) -> 동(3) , 서(4) -> 위(1) , 바닥(6) -> 서(4) , 동(3) -> 바닥(6) newDiceNum(0) = diceNum(2) newDiceNum(3) = diceNum(0) newDiceNum(5) = diceNum(3) newDiceNum(2) = diceNum(5) } 2 -> { //서 //위(1) -> 서(4) , 서(4) -> 바닥(6) , 바닥(6) -> 동(3) , 동(3) -> 위(1) newDiceNum(0) = diceNum(3) newDiceNum(3) = diceNum(5) newDiceNum(5) = diceNum(2) newDiceNum(2) = diceNum(0) } 3 -> { //북 //위(1) -> 북(2) , 북(2) -> 바닥(6) , 바닥(6) -> 남(5) , 남(5) -> 위(1) newDiceNum(0) = diceNum(1) newDiceNum(1) = diceNum(5) newDiceNum(5) = diceNum(4) newDiceNum(4) = diceNum(0) } 4 -> { //남 //위(1) -> 남(5) , 남(5) -> 바닥(6) , 바닥(6) -> 북(2) , 북(2) -> 위(1) newDiceNum(0) = diceNum(4) newDiceNum(4) = diceNum(5) newDiceNum(5) = diceNum(1) newDiceNum(1) = diceNum(0) } } diceNum = newDiceNum x = newX y = newY if (board(x)(y) == 0) { board(x)(y) = diceNum(5) } else { diceNum(5) = board(x)(y) board(x)(y) = 0 } println(diceNum(0)) } private fun isInMap(x: Int, y: Int) = (x in 0 until N) && (y in 0 until M)