청소

황인성·2023년 12월 27일

문제

청소로봇이 방을 청소하려고 합니다. 방은 n*n 격자판 지도로 표현됩니다.
방에는 장애물이 있고, 장애물이 있는 지점은 로봇이 지나갈 수 없습니다.
로봇은 지도의 왼쪽 가장 위 격자에서 3시 방향(오른쪽)을 보고 있습니다.
로봇이 한 격자를 이동하는데 걸리는 시간은 1초입니다.
로봇은 매초 한 칸씩 보고 있는 방향으로 이동합니다. 만약 지도 끝으로 이동해 더 이상 전진
할 수 없거나 또는 장애물을 만나면 제자리에서 시계방향으로 90도 회전합니다. 회전하는데도
1초의 시간이 필요합니다.
매개변수 board에 방의 지도정보가 주어지고, k에 초시간이 주어지면 로봇이 움직이기 시작해
서 k초 후에 멈춥니다. k초 후 로봇의 위치를 반환하는 프로그램을 작성하세요.

입출력 예:

board k answer
[ [0, 0, 0, 0, 0], [0, 1, 1, 0, 0], [0, 0, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0] ] 10 [2, 2]
[ [0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ] 20 [4, 5]
[ [0, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0] ] 25 [0, 1]

접근 방법

문제에 나와있는대로 풀이하면 되는 문제일 듯 하다.
바라보는 방향에 따라 잘 이동시키는게 중요할 듯 하다.

풀이

class Solution {
    char[] direction = {'R', 'D', 'L', 'U'};

    public int[] solution(int[][] board, int k){
        int[] answer = new int[2];
        int length = board[0].length;

        int row = 0, col = 0, idx = 0;

        // 주어진 k 만큼 이동시키기
        for (int i = 0; i < k; i++) {
            //장애물이거나 이동할 수 없는 위치면 방향 바꾸기
            if (direction[idx] == 'R') {
                int nextCol = col + 1;
                if (nextCol == length || board[row][nextCol] == 1) {
                    idx++;
                } else {
                    col = nextCol;
                }
            } else if (direction[idx] == 'D') {
                int nextRow = row + 1;
                if (nextRow == length || board[nextRow][col] == 1) {
                    idx++;
                } else {
                    row = nextRow;
                }
            } else if (direction[idx] == 'L') {
                int nextCol = col - 1;
                if (nextCol < 0 || board[row][nextCol] == 1) {
                    idx++;
                } else {
                    col = nextCol;
                }
            } else if (direction[idx] == 'U') {
                int nextRow = row - 1;
                if (nextRow < 0 || board[nextRow][col] == 1) {
                    idx = 0;
                } else {
                    row = nextRow;
                }
            }
        }

        answer[0] = row;
        answer[1] = col;

        return answer;
    }

    public static void main(String[] args){
        Solution T = new Solution();
        int[][] arr1 = {{0, 0, 0, 0, 0},
            {0, 1, 1, 0, 0},
            {0, 0, 0, 0, 0},
            {1, 0, 1, 0, 1},
            {0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr1, 10)));
        int[][] arr2 = {{0, 0, 0, 1, 0, 1},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 1},
            {1, 1, 0, 0, 1, 0},
            {0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr2, 20)));
        int[][] arr3 = {{0, 0, 1, 0, 0},
            {0, 1, 0, 0, 0},
            {0, 0, 0, 0, 0},
            {1, 0, 0, 0, 1},
            {0, 0, 0, 0, 0}};
        System.out.println(Arrays.toString(T.solution(arr3, 25)));

    }
}

다른 풀이

동서남북을 좌표 배열로 두고 그 좌표의 인덱스를 방향으로 두게끔하면 좀 더 효율적으로 풀 수 있는 문제였다.

profile
안녕하세요?

0개의 댓글