나의 풀이
이 문제는 문제에서 말하는대로만 따라가다 보면 쉽게 해결할 수 있는 간단한 시뮬레이션 문제이다. 리팩토링을 통해 더 좋은 코드를 만들 수 있겠지만 나는 직관적으로 문제를 해결하였다. 이 문제는 주석을 통해 문제를 설명하겠다.
val dx = arrayOf(-1, 0, 1, 0)
val dy = arrayOf(0, 1, 0, -1)
lateinit var room : Array<IntArray>
fun main() = with(System.`in`.bufferedReader()) {
val (n, m) = readLine().split(" ").map { it.toInt() }
val (r, c, d) = readLine().split(" ").map { it.toInt() }
room = Array(n) { readLine().split(" ").map { it.toInt() }.toIntArray() }
var tempX = r
var tempY = c
var way = d
var cnt = 0
while (true) {
// 지금칸에 청소를 해야하면 청소
if (room[tempX][tempY] == 0) {
room[tempX][tempY] = -1
cnt++
}
// 주위에 청소해야하는지 확인
var check = 0
for (i in 0 until 4) {
val cleanX = tempX + dx[i]
val cleanY = tempY + dy[i]
if (cleanX in 0 until n
&& cleanY in 0 until m
&& room[cleanX][cleanY] == 0) {
check++
}
}
// 현재 칸의 주변 중 청소되지 않는 빈 칸이 없는 경우
if (check == 0) {
// 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
var reverse = when(way) {
0 -> 2
1 -> 3
2 -> 0
else -> 1
}
val reverseX = tempX + dx[reverse]
val reverseY = tempY + dy[reverse]
if(room[reverseX][reverseY] != 1) {
tempX = reverseX
tempY = reverseY
}
else break // 후진할 수 없다면 작동을 멈춘다.
}
// 현재 칸의 주변 중 청소되지 않는 빈 칸이 있는 경우
else {
// 반시계 방향으로 90도 회전
way = when(way) {
0 -> 3
1 -> 0
2 -> 1
else -> 2
}
// 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진
val turnX = tempX + dx[way]
val turnY = tempY + dy[way]
if (room[turnX][turnY] == 0) {
tempX = turnX
tempY = turnY
}
}
}
println(cnt)
}
'백준 > 구현' 카테고리의 다른 글
15685: 드래곤 커브 - Kotlin (0) | 2023.05.23 |
---|---|
14890번: 경사로 - Kotlin (0) | 2023.03.29 |
16235번: 나무 재테크 - Kotlin (0) | 2023.02.10 |
14499번: 주사위 굴리기 - Kotlin (0) | 2023.02.02 |
3190번: 뱀 - Kotlin (0) | 2023.01.31 |