본문 바로가기

알고리즘

[BOJ] 14503번: 로봇 청소기 (JAVA)

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {

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

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

    static void start(int x, int y, int d){

        if(map[x][y]==1) return;
        else if(map[x][y]==0){
            map[x][y]=2;
            answer++;
        }

        for(int i=0;i<4;i++){
            d = (d+3) % 4; //반시계 방향으로 탐색해야한다
            int nx = x + dx[d];
            int ny = y + dy[d];

            //이미 청소 했거나 벽일 경우
            if(map[nx][ny]>0) continue;
            start(nx,ny,d);
            return;
        }
        //네 방향 다 돌아보고 나서 바라보는 방향 유지한 채 한칸 후진 후 다시 탐색 시작
        start(x-dx[d], y-dy[d],d);

    }

//    static boolean isWall(int x, int y){
//        if(x<=0||x>=N-1||y<=0||y>=M-1) return true;
//        return false;
//    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        d = Integer.parseInt(st.nextToken());

        answer = 0;
        map = new int[N][M];
        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<M;j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        start(r, c, d);
        System.out.println(answer);

    }
}

 

청소기가 청소를 한 곳을 다시 못간다고 생각해서 map을 boolean으로, 방문하면 다 벽을 만들어버렸는데 청소를 한 곳도 방문할 수 있었다. 방향을 바꾸는 부분이 헷갈려서 오래 걸렸다.

정답을 맞추긴 했지만 여전히 헷갈리기는 한다.