본문 바로가기
알고리즘/BAEKJOON

[백준] 14503 로봇 청소기 (Java)

by kyeee2 2022. 6. 6.

[14503 로봇 청소기]

난이도: 골드5

 

14503번: 로봇 청소기

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

www.acmicpc.net

문제

입력

출력


[아이디어]

문제에 써있는 설명대로 코드를 작성해주면 되는 시뮬레이션 문제이다.

조심해야되는 부분은 후진할 때는 청소를 한 장소여도 후진할 수 있다.

그리고 후진한 후 청소를 다시 해주면 안된다는 것이다. 청소하지 않은 장소인 경우에만 청소해주자.


[JAVA 코드]

package bj.g5;

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

public class BJ_G5_14503_로봇청소기 {
	
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	
	static int N, M;
	static int [][] map;
	static boolean [][] visited;
	static int [] dr = {-1, 0, 1, 0}, dc = {0, 1, 0, -1};
	
	static class Robot {
		int r, c, dir;
		
		public Robot(int r, int c, int dir) {
			this.r = r;
			this.c = c;
			this.dir = dir;
		}
	}

	public static void main(String[] args) throws IOException {
		tokens = new StringTokenizer(br.readLine());
		N = Integer.parseInt(tokens.nextToken());
		M = Integer.parseInt(tokens.nextToken());
		
		tokens = new StringTokenizer(br.readLine());
		int r = Integer.parseInt(tokens.nextToken());
		int c = Integer.parseInt(tokens.nextToken());
		int dir = Integer.parseInt(tokens.nextToken());
		Robot robot = new Robot(r, c, dir);
		
		map = new int [N][M];
		visited = new boolean [N][M];
		for(r = 0; r < N; r++) {
			tokens = new StringTokenizer(br.readLine());
			for(c = 0; c < M; c++) {
				map[r][c] = Integer.parseInt(tokens.nextToken());
			}
		}
		
		int cnt = 0; // 로봇이 청소한 칸의 개수
		while(true) {
			boolean flag = false; // 4방향 중 하나라도 청소 가능한가?
			
			// 현재 위치를 청소하지 않았다면 청소하기
			if(!visited[robot.r][robot.c]) {
				cnt++;
				visited[robot.r][robot.c] = true;
			}
			
			// 4방향 왼쪽으로 돌면서 탐색
			for(int i = 1; i <= 4; i++) {
				int nDir = (robot.dir - i + 4) % 4;
				int nr = robot.r + dr[nDir];
				int nc = robot.c + dc[nDir];
				
				if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
				if(map[nr][nc] == 1 || visited[nr][nc]) continue;
				
				// 청소 가능한 방향인 경우
				robot.r = nr;
				robot.c = nc;
				robot.dir = nDir;
				flag = true;
				break;
			}
			
			// 4방향 모두 청소 불가능한 경우
			if(!flag) {
				int nr = robot.r + dr[(robot.dir + 2) % 4];
				int nc = robot.c + dc[(robot.dir + 2) % 4];
				
				if(map[nr][nc] == 1) { // 벽인 경우 작동을 멈춘다.
					break;
				} else {
					robot.r = nr;
					robot.c = nc;
				}
			}
		}
		
		System.out.println(cnt);
	}

}

댓글