Developing Myself Everyday
article thumbnail
 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

나의 풀이

이 문제는 문제에서 말하는대로만 따라가다 보면 쉽게 해결할 수 있는 간단한 시뮬레이션 문제이다. 리팩토링을 통해 더 좋은 코드를 만들 수 있겠지만 나는 직관적으로 문제를 해결하였다. 이 문제는 주석을 통해 문제를 설명하겠다.

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
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!