코딩테스트

[백준 14503] 로봇 청소기 자바 - 시뮬레이션

양쏘쏘 2023. 10. 16. 15:00
728x90
반응형

문제

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

메모리 11836KB 시간 88MS

 

접근방식

시뮬레이션 문제이기 때문에 조건을 꼼꼼히 읽으면서 적용시켰다. 그리고 방향이 중요하기 때문에 dx,dy를 조건대로 만들어주고 90도 회전, 후진할 때 방향 계산을 해주는 거에 주의했다. 

풀이

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

public class Main {
	static int N, M, board[][], count;
	static int[] dx = { -1, 0, 1, 0 };
	static int[] dy = { 0, 1, 0, -1 };
	static int[] robot;

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

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		board = new int[N][M];
		robot = new int[3];

		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < 3; i++) {
			robot[i] = Integer.parseInt(st.nextToken());
		}
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		while (true) {
			if (!search())
				break;
		}
		System.out.println(count);
	}

	private static boolean search() {
		int x = robot[0];
		int y = robot[1];
		boolean unclean = false;

		clean();

		for (int i = 0; i < dx.length; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (isRange(nx, ny)) {
				if (board[nx][ny] == 0) {
					unclean = true;
					break;
				}
			}
		}

		//청소되지 않은 칸 존재
		if (unclean) {
			robot[2] = (robot[2] - 1) < 0 ? 3 : (robot[2] - 1);
			int nx = x + dx[robot[2]];
			int ny = y + dy[robot[2]];
			if (isRange(nx, ny) && board[nx][ny] == 0) {
				robot[0] = nx;
				robot[1] = ny;
			}
		} else {
			//후진
			int direction = robot[2] + 2;
			direction = direction >= 4 ? direction-4 : direction;
			
			int nx = x + dx[direction];
			int ny = y + dy[direction];
			if (isRange(nx, ny) && board[nx][ny] != 1) {
				robot[0] = nx;
				robot[1] = ny;
			} else {
				return false;
			}
		}
		return true;
	}

	private static boolean isRange(int nx, int ny) {
		return nx >= 0 && nx < N && ny >= 0 && ny < M;
	}

	private static void clean() {
		int x = robot[0];
		int y = robot[1];
		//현재 칸 청소 안된 경우
		if (board[x][y] == 0) {
			board[x][y] = -1;
			count++;
		}

	}
}
728x90