코테/백준

[BOJ] 14503 로봇청소기 (Java)

zsunny 2023. 4. 30. 08:25

📌 문제

📍 제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static int N;
    static int M;
    static int r;
    static int c;
    static int d;

    static int[][] arr;
    static boolean[][] clean;

    static int[] dx = {-1, 0, 1, 0};    // 북, 동, 남, 서
    static int[] dy = {0, 1, 0, -1};

    public static void robot(int x, int y, int idx) {
        while(true) {
            clean[x][y] = true;
            // 사방으로 둘러보며 청소할 빈 칸 있는지 탐색
            int flag = 0;
            for(int i=0; i<4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(arr[nx][ny]==0 && clean[nx][ny]==false) {    // 청소할 곳 있으면
                    flag = 1;                                    // 표시
                }
            }
            if(flag == 0) {        // 청소할 곳 없으면
                // 후진했을 때, 청소는 했지만 빈칸인 곳 있으면
                if(arr[x-dx[idx]][y-dy[idx]]==0 && clean[x-dx[idx]][y-dy[idx]]==true) {
                    x -= dx[idx];        // 좌표 후진
                    y -= dy[idx];        // 좌표 후진
                }else{            // 후진 하려는데 벽으로 막혀있다?
                    break;        // 종료
                }
            }else {                // 청소할 곳 있으면
                idx = (idx + 3) % 4;    // 반시계로 90도 회전
                // 빈칸이고 아직 청소안한 곳
                if(arr[x+dx[idx]][y+dy[idx]]==0 && clean[x+dx[idx]][y+dy[idx]]==false) {
                    x += dx[idx];    // 앞으로(현재 dir) 이동
                    y += dy[idx];    // 앞으로(현재 dir) 이동
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());    // 방 크기
        M = Integer.parseInt(st.nextToken());    // 방 크기

        arr = new int[N][M];
        clean = new boolean[N][M];

        st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());    // 로봇 청소기 처음 위치 행
        c = Integer.parseInt(st.nextToken());    // 로봇 청소기 처음 위치 열
        d = Integer.parseInt(st.nextToken());    // 로봇 청소기가 바라보는 방향

        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        robot(r, c, d);

        int cnt = 0;
        for(boolean[] r : clean) {
            for(boolean c : r) {
                if(c == true) {
                    cnt++;
                }
            }
        }
        System.out.println(cnt);
    }
}

📝 풀이

이해하지 못했던 부분

문제에서 주어진 그대로 구현하는 게 중요했던 문제다.

 1. 4칸 탐색을 로봇 청소기가 하는 게 아니라 탐색을 해서 알려주어야 했다.
 2. 빈칸이 나올때까지 90도 회전이 아니라 그냥 90도 회전해서 없으면 1로 돌아가고 있으면 한칸 이동해야 했다.

새로 알게된 부분

  1. 좌표 후진은 idx를 그냥 빼주면 된다.
    x -= dx[idx];        // 좌표 후진
    y -= dy[idx];        // 좌표 후진
  2. 반시계로 회전하는 idx 만들기
    idx = (idx + 3) % 4;    // 반시계로 90도 회전