Algorithm/Baekjoon Online Judge

[Java] BOJ14503_로봇 청소기

'지훈' 2021. 4. 19. 12:25

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net


문제에 주어진 조건대로 구현하는 시뮬레이션 문제이다.

 

d라는 방향 값을 가지고 왼쪽 방향이 벽(값이 1)이거나 청소(값이 2)를 이미 했다면 방향을 회전시켜주고 방향을 몇 번 회전시켜주는지 나타내 주는 cnt를 증가시킨다.

cnt가 4가 될 경우 네방향 모두 벽이거나 청소를 했다는 것이기 때문에 후진을 할 수 있는지 판단한다.

후진 방향이 벽이면 반복문을 빠져나오고 그렇지 않은 경우 cnt를 0으로 초기화해주고 뒤로 이동한다.

 

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		st= new StringTokenizer(br.readLine());
		int r = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		int d = Integer.parseInt(st.nextToken());  //0북 1동 2남 3서
		//1벽 0청소안한 땅 2청소한 땅
		int[][] room = new int[N][M];
		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());
			}
		}
		int res = 0;
		int cnt = 0;
		while(true) {
			if(room[r][c] == 0) {
				room[r][c] = 2;
				res++;
				cnt = 0;
			}
			if(cnt==4) { //사방이 벽이면
				if(d==0) {
					if(room[r+1][c] == 1) break; //뒤쪽이 벽이면
					else r++;
				} else if(d==1) {
					if(room[r][c-1] == 1) break; //뒤쪽이 벽이면
					else c--;
				} else if(d==2) {
					if(room[r-1][c] == 1) break; //뒤쪽이 벽이면
					else r--;
				} else if(d==3) {
					if(room[r][c+1] == 1) break; //뒤쪽이 벽이면
					else c++;
				}
				cnt = 0;
				continue;
			}
			if(d==0) {
				if(room[r][c-1] == 1 || room[r][c-1] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
				else c--;
				d=3;
			} else if(d==1) {
				if(room[r-1][c] == 1 || room[r-1][c] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
				else r--;
				d=0;
			} else if(d==2) {
				if(room[r][c+1] == 1 || room[r][c+1] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
				else c++;
				d=1;
			} else if(d==3) {
				if(room[r+1][c] == 1 || room[r+1][c] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
				else r++;
				d=2;
			}
		}
		System.out.println(res);
	}

}