로봇 청소기

Huisu·2023년 11월 10일
0

Coding Test Practice

목록 보기
66/98
post-thumbnail

문제

14503번: 로봇 청소기

문제 설명

로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 NxM 크기의 직사각형으로 나타낼 수 있으며, 1×1 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 (r, c)로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0, 0) (0, 0), 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 (N-1, M-1)이다. 즉, 좌표 (r, c)는 북쪽에서 (r+1)번째에 있는 줄의 서쪽에서 (c+1)번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.

로봇 청소기는 다음과 같이 작동한다.

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90도 회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.

제한 사항

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

셋째 줄부터 N개의 줄에 각 장소의 상태를 나타내는 NxM개의 값이 한 줄에 M개씩 입력된다. i번째 줄의 �jj번째 값은 칸 (i, j)의 상태를 나타내며, 이 값이 0인 경우 (i, j)가 청소되지 않은 빈 칸이고, 1인 경우 (i, j)에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.

입출력 예

입력출력
3 3
1 1 0
1 1 1
1 0 1
1 1 11
11 10
7 4 0
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 1 1 1 1 0 1
1 0 0 1 1 0 0 0 0 1
1 0 1 1 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 1 1 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 157

아이디어

dfs dfs dfs!!!

구현으로만 풀다가 빡챠ㅕ서 보니까 dfs임 진짜 if 종료조건 왜이렇게 못찾지???

제출 코드


public class five14503 {
    private int colNum;
    private int rowNum;
    private int[][] room;
    private int[] dCol = new int[]{-1, 0, 1, 0};
    private int[] dRow = new int[]{0, 1, 0, -1};
    private int result = 1;

    public void solution() throws IOException {
        Scanner sc = new Scanner(System.in);
        colNum = sc.nextInt();
        rowNum = sc.nextInt();
        room = new int[colNum][rowNum];

        int machineCol = sc.nextInt();
        int machineRow = sc.nextInt();
        int machineDir = sc.nextInt();

        for (int i = 0; i < colNum; i++) {
            for (int j = 0; j < rowNum; j++) {
                room[i][j] = sc.nextInt();
            }
        }

        clean(machineCol, machineRow, machineDir);

        System.out.println(result);
    }

    private void clean(int machineCol, int machineRow, int machineDir) {
        room[machineCol][machineRow] = -1;

        for (int i = 0; i < 4; i++) {
            machineDir = (machineDir + 3) % 4;
            int nextCol = machineCol + dCol[machineDir];
            int nextRow = machineRow + dRow[machineDir];

            if (nextCol < 0 || nextCol >= colNum || nextRow < 0 || nextRow >= rowNum) {
                continue;
            }
            if (room[nextCol][nextRow] == 0) {
                result++;
                clean(nextCol, nextRow, machineDir);
                return;
            }
        }

        int backDirection = (machineDir + 2) % 4;
        int backCol = machineCol + dCol[backDirection];
        int backRow = machineRow + dRow[backDirection];
        if (backCol >= 0 && backCol < colNum && backRow >= 0 && backRow < rowNum && room[backCol][backRow] != 1) {
            clean(backCol, backRow, machineDir);
        }
    }

    public static void main(String[] args) throws IOException {
        new five14503().solution();
    }
}

0개의 댓글