Algorithm/BOJ

14503. 로봇 청소기

 

1. 현재 위치를 청소한다.

2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.

    - 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.

    - 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.

    - 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.

    - 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

 

청소를 마친경우의 좌표값을 2로 만들어서 체크해주었다.

 

 

 

 

 

더보기
더보기
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static int N, M, x, y, d;
    // d -> 0 : 북쪽
    // d -> 1 : 동쪽
    // d -> 2 : 남쪽
    // d -> 3 : 서쪽

    static int[][] MAP;

    public static void InputData() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(stk.nextToken());
        M = Integer.parseInt(stk.nextToken());

        stk = new StringTokenizer(br.readLine(), " ");
        x = Integer.parseInt(stk.nextToken());
        y = Integer.parseInt(stk.nextToken());
        d = Integer.parseInt(stk.nextToken());

        MAP = new int[N][M];

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

        br.close();
    }
    public static boolean isWall(int x, int y){
        if(MAP[x][y] == 1) return true;
        return false;
    }

    public static boolean isClean(int x, int y){
        if(MAP[x][y] == 2) return true;
        return false;
    }

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        InputData();
        int ans = 0;

        int Counter = 0;
        while(Counter <= 4){
            if(MAP[x][y] == 0) {
                MAP[x][y] = 2;
                ans++;
            }

            switch (d){// 현재 바라보는 방향
                case 0: //북쪽 -> 서쪽 확인
                    if(y == 0 || isWall(x, y - 1) || isClean(x, y - 1)){
                        Counter++;
                        if(Counter > 4 && (x != N - 1 && !isWall(x + 1, y))){
                            Counter = 0;
                            x++;
                            break;
                        }// 현재 북쪽을 보고있으므로, 남쪽을 확인
                    }else {
                        y--;
                        Counter = 0;
                    }

                    d = 3;
                    break;
                case 1: //동쪽 -> 북쪽 확인
                    if(x == 0 || isWall(x - 1, y) || isClean(x - 1, y)){
                        Counter++;
                        if(Counter > 4 && (y != 0 && !isWall(x, y - 1))){
                            Counter = 0;
                            y--;
                            break;
                        }// 현재 동쪽을 보고있으므로, 서쪽을 확인
                    }else {
                        x--;
                        Counter = 0;
                    }
                    d = 0;
                    break;
                case 2: //남쪽 -> 동쪽 확인
                    if(y == M - 1 || isWall(x, y + 1) || isClean(x, y + 1)){
                        Counter++;
                        if(Counter > 4 && (x != 0 && !isWall(x - 1, y))){
                            Counter = 0;
                            x--;
                            break;
                        }// 현재 남쪽을 보고있으므로, 북쪽을 확인
                    }else {
                        y++;
                        Counter = 0;
                    }
                    d = 1;
                    break;
                default: //서쪽 -> 남쪽 확인
                    if(x == N - 1 || isWall(x + 1, y) || isClean(x + 1, y)){
                        Counter++;
                        if(Counter > 4 && (y != M - 1 && !isWall(x, y + 1))){
                            Counter = 0;
                            y++;
                            break;
                        }// 현재 서쪽을 보고있으므로, 동쪽을 확인
                    }else {
                        x++;
                        Counter = 0;
                    }

                    d = 2;
                    break;
            }

        }

        bw.write(String.valueOf(ans));
        bw.flush(); bw.close();
    }
}