14503번 : 로봇 청소기 [Java]

2021. 3. 31. 21:19Algorithm/백준

반응형

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

해결 방안

로봇 청소기의 작동 원리 순서대로 하나씩 체크하면서 청소를 할 수 있는지 확인한다.

 

한 개의 while문을 사용해 

1. 현재 자리가 청소 가능하다면 청소하고 바꿔주자

2. 왼쪽을 탐색해보고 청소 가능하다면 이동하자

3. 왼쪽이 청소 불가능하다면 다시 왼쪽을 보자

4. 한 바퀴를 돌며 다 확인했다면, 후진할 위치를 보자

5. 후진할 위치가 벽이면 멈추고 벽이 아니라면 이동하자

 

위 순서대로 작성해주면 된다.

 

전체 코드

import java.util.Scanner;

public class Main {
	static class Point {
		int x, y, d;

		Point(int x, int y, int d) {
			this.x = x;
			this.y = y;
			this.d = d;
		}
	}

	static int N, M;
	static int r, c, d;
	static int[][] map;
	static int[] dr = { -1, 0, 1, 0 };
	static int[] dc = { 0, 1, 0, -1 };
	static int cnt;
	static int ans;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt(); // 세로크기
		M = sc.nextInt(); // 가로크기
		r = sc.nextInt();
		c = sc.nextInt();
		d = sc.nextInt(); // 바라보는 방향 : 0북, 1동, 2남, 3서

		map = new int[N][M];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				map[i][j] = sc.nextInt();
			}
		}

		cnt = 0;
		ans = 0;

		search(r, c, d);
		System.out.println(ans);
	}

	private static void search(int r, int c, int d) {

		while (true) {

			if (map[r][c] == 0) {
				map[r][c] = -1;
				ans++;
			}

			int dd = (d + 3) % 4;
			int nx = r + dr[dd];
			int ny = c + dc[dd];
			if (map[nx][ny] == 0) { // 청소 가능
				r = nx;
				c = ny;
				d = dd;
				cnt = 0;
			} else { // 청소 불가능
				cnt++;
				d = dd;
			}

			if (cnt == 4) {
				int bx = r - dr[d];
				int by = c - dc[d];
				if (map[bx][by] == 1) {
					return;
				} else {
					r = bx;
					c = by;
					cnt = 0;
				}
			}
		}
	}
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

2583번 : 영역 구하기 [Java]  (0) 2021.04.09
17103번 : 골드바흐 파티션 [Java]  (0) 2021.03.31
1309번 : 동물원 [Java]  (0) 2021.03.28
14888번 : 연산자 끼워넣기 [Java]  (0) 2021.03.12
13458번 : 시험 감독 [Java]  (0) 2021.03.11