https://www.acmicpc.net/problem/14499
안녕하세요, 이륙사입니다. 이번 게시물에서는 주사위 굴리기 문제를 풀고 개인적으로 되돌아볼 점을 정리했습니다.
중요 포인트
1. 3차원의 주사위를 1차원의 배열로 표현한다.
val dice = IntArray(6) // 위, 바닥, 동, 서, 남, 북
인덱스를 특정한 면으로 가정한다.
2. 굴릴 때마다 방향에 맞게 주사위의 상태를 변경한다.
fun moveDice(dice: IntArray, cmd: Int) {
when(cmd) {
1 -> moveEast(dice)
2 -> moveWest(dice)
3 -> moveNorth(dice)
else -> moveSouth(dice)
}
}
fun moveEast(dice: IntArray) {
val temp = dice[0]
dice[0] = dice[3]
dice[3] = dice[1]
dice[1] = dice[2]
dice[2] = temp
}
지문 해석이 어렵게 느껴졌던 이유
- 문제를 재정의하지 않았다. -> 문제를 확실히 이해하지 않고 풀이부터 시도했다
- 전개도가 왜 주어졌는지 모른채, 전개도대로만 문제를 바라보려고 했다.
코드
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
var st = StringTokenizer(readLine())
val rowSize = st.nextToken().toInt()
val colSize = st.nextToken().toInt()
var row = st.nextToken().toInt()
var col = st.nextToken().toInt()
val cmdSize = st.nextToken().toInt()
val graph = Array(rowSize) {
st = StringTokenizer(readLine())
IntArray(colSize) {
st.nextToken().toInt()
}
}
val dice = IntArray(6) // 위, 바닥, 동, 서, 남, 북
val answer = StringBuilder()
st = StringTokenizer(readLine())
val dRow = intArrayOf(0, 0, 0, -1, 1)
val dCol = intArrayOf(0, 1, -1, 0, 0)
for (i in 0 until cmdSize) {
val cmd = st.nextToken().toInt()
val nextR = row + dRow[cmd]
val nextC = col + dCol[cmd]
if (nextR !in 0 until rowSize || nextC !in 0 until colSize) {
continue
}
moveDice(dice, cmd)
if (graph[nextR][nextC] == 0) {
graph[nextR][nextC] = dice[1]
} else{
dice[1] = graph[nextR][nextC]
graph[nextR][nextC] = 0
}
row = nextR
col = nextC
answer.append(dice[0]).appendLine()
}
print(answer)
}
fun moveDice(dice: IntArray, cmd: Int) {
when(cmd) {
1 -> moveEast(dice)
2 -> moveWest(dice)
3 -> moveNorth(dice)
else -> moveSouth(dice)
}
}
fun moveEast(dice: IntArray) {
val temp = dice[0]
dice[0] = dice[3]
dice[3] = dice[1]
dice[1] = dice[2]
dice[2] = temp
}
fun moveWest(dice: IntArray) {
val temp = dice[0]
dice[0] = dice[2]
dice[2] = dice[1]
dice[1] = dice[3]
dice[3] = temp
}
fun moveNorth(dice: IntArray) {
val temp = dice[0]
dice[0] = dice[4]
dice[4] = dice[1]
dice[1] = dice[5]
dice[5] = temp
}
fun moveSouth(dice: IntArray) {
val temp = dice[0]
dice[0] = dice[5]
dice[5] = dice[1]
dice[1] = dice[4]
dice[4] = temp
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 2026번: 소풍 (Kotlin) (0) | 2022.01.25 |
---|---|
백준 1208번: 부분수열의 합2 (Kotlin) (0) | 2022.01.23 |
백준 2632번: 피자 판매 (Kotlin) (0) | 2022.01.21 |
백준 1261번: 알고스팟 (Kotlin) (0) | 2022.01.20 |
백준 2661번: 좋은 수열 (Kotlin) (0) | 2022.01.19 |