접근

주어진 작업 순서에 따라 단순히 코드 구현만 하면 되는 문제다. 다만 방향을 고려하는 과정이 좀 헷갈렸는데, 로봇 청소기의 d가 나타내는 값은 시계 방향이고 회전 방향은 반시계 방향이었기 때문이다. 그래서 회전할 때 현재 방향에 3을 더하고 4로 나눈 나머지값을 활용했고, 후진을 할 때는 2를 더했다.

 

코드

package week9;

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

public class BJ14503 {
    static class Pos{
        int x, y, d;

        public Pos(int x, int y, int d) {
            this.x = x;
            this.y = y;
            this.d = d;
        }
    }

    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int n, m;
    static int[][] room;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;

        // 입력값 저장
        st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        room = new int[n][m];

        st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken()); // 0~4: 북동남서
        Pos vacuum = new Pos(r, c, d);

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++)
                room[i][j] = Integer.parseInt(st.nextToken());
        }
        
        // 청소기 작동
        clean(vacuum);

        // 청소한 칸의 개수 표시
        int sum = 0;
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < m; j++)
                if(room[i][j] == 2) sum++;

        System.out.println(sum);
    }

    private static void clean(Pos vacuum) {
        while(true){
            // 1번 작업
            if(room[vacuum.x][vacuum.y] == 0)
                room[vacuum.x][vacuum.y] = 2;

            boolean needToClean = false;

            // 3번 작업
            for (int i = 0; i < 4; i++) {
                vacuum.d = (vacuum.d+3) % 4;
                int nx = vacuum.x + dx[vacuum.d];
                int ny = vacuum.y + dy[vacuum.d];
                if(!inBound(nx, ny) || room[nx][ny] != 0) continue;

                vacuum.x = nx;
                vacuum.y = ny;
                needToClean = true;
                break;
            }

            // 2번 작업
            if(!needToClean) {
                int backDir = (vacuum.d+2) % 4;
                int nx = vacuum.x + dx[backDir];
                int ny = vacuum.y + dy[backDir];

                // 2-2번 작업
                if(!inBound(nx, ny) || room[nx][ny] == 1) break;
                else{
                    vacuum.x = nx;
                    vacuum.y = ny;
                }
            }
        }
    }

    static boolean inBound(int x, int y){
        return !(x < 0 || y < 0 || x >= n || y >= m);
    }

    static void print(){
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(room[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
}

+ Recent posts