[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);
}
}
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 11660 구간 합 구하기 5 (Java) (0) | 2022.06.23 |
---|---|
[백준] 17779 게리맨더링2 (Java) (0) | 2022.06.03 |
[백준] 2141 우체국 (Java) (0) | 2022.06.03 |
[백준] 13265 색칠하기 (Java) (0) | 2022.05.29 |
[백준] 11653 소인수분해 (Java) (0) | 2022.05.26 |
댓글