Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

난이도 : 골드 5
태그 : 구현, 시뮬레이션

 

 

설명

단순 구현 + 시뮬레이션 문제이기에, 저는 큐나 DFS 없이 단순 구현으로 풀었습니다.

문제의 지문을 읽고 그대로 구현하면 되는데, 주의할 점이 몇 가지 있습니다.

 

 

로봇은 청소되지 않은 빈 칸이 있을 경우, 일단 반시계 방향으로 회전합니다.

현재 바라보고 있는 방향부터 탐색(X)

일단 왼쪽으로 한 번 틀고 4방향 탐색(O)

 

 

 

소스코드

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {

    // 북동남서 순
    val dx = arrayOf(-1, 0, 1, 0)
    val dy = arrayOf(0, 1, 0, -1)

    val (n, m) = readLine().split(" ").map { it.toInt() }
    var (robotX, robotY, robotD) = readLine().split(" ").map { it.toInt() }
    // 0123 : 북동남서 순

    val map = Array(n) {
        val st = StringTokenizer(readLine())
        Array(m) { st.nextToken().toInt() }
    }

    var cnt = 0

    turn@ while (true) {
        // 현재 칸이 청소되어 있지 않음 -> 청소
        if (map[robotX][robotY] == 0) {
            map[robotX][robotY] = -1
            cnt++
        } else if (map[robotX][robotY] == 1) {
            break@turn
        }

        for (i in 0 until 4) {
            if (--robotD == -1) robotD = 3

            val nx = robotX + dx[robotD]
            val ny = robotY + dy[robotD]

            // 청소하지 않은 곳을 발견하면 이동
            if (map[nx][ny] == 0) {
                robotX = nx
                robotY = ny
                continue@turn
            }
        }

        // 4 방향 모두 다 이미 청소했다면? -> 후진
        robotX -= dx[robotD]
        robotY -= dy[robotD]
    }

    println(cnt)
}

 

 

dx, dy를 사용하였는데요.

입력이 0 - 북, 1-동, 2-남, 3-서 순서대로 주어지기 때문에,

  0(북 1(동) 2(남) 3(서)
dx -1 0 1 0
dy 0 1 0 -1

 

위와 같은 순서로 dx, dy의 원소를 만들었습니다.

또한, 반시계 방향으로 90도 씩 회전하기 때문에, 방향(robotD)를 1씩 감소시키면서 반시계 90도 회전을 나타낼 수 있습니다.

 

 

 

 

후기

푼 사람이 은근 많다 싶었는데, 알고보니 삼성 기출문제네요.

이런 문제만 나오면 얼마나 좋을지...ㅎㅎ

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.