협회: 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)