접근
주어진 작업 순서에 따라 단순히 코드 구현만 하면 되는 문제다. 다만 방향을 고려하는 과정이 좀 헷갈렸는데, 로봇 청소기의 d가 나타내는 값은 시계 방향이고 회전 방향은 반시계 방향이었기 때문이다. 그래서 회전할 때 현재 방향에 3을 더하고 4로 나눈 나머지값을 활용했고, 후진을 할 때는 2를 더했다.
코드
package week9;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BJ14503 {
static class Pos{
int x, y, d;
public Pos(int x, int y, int d) {
this.x = x;
this.y = y;
this.d = d;
}
}
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int n, m;
static int[][] room;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
// 입력값 저장
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
room = new int[n][m];
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken()); // 0~4: 북동남서
Pos vacuum = new Pos(r, c, d);
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());
}
// 청소기 작동
clean(vacuum);
// 청소한 칸의 개수 표시
int sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if(room[i][j] == 2) sum++;
System.out.println(sum);
}
private static void clean(Pos vacuum) {
while(true){
// 1번 작업
if(room[vacuum.x][vacuum.y] == 0)
room[vacuum.x][vacuum.y] = 2;
boolean needToClean = false;
// 3번 작업
for (int i = 0; i < 4; i++) {
vacuum.d = (vacuum.d+3) % 4;
int nx = vacuum.x + dx[vacuum.d];
int ny = vacuum.y + dy[vacuum.d];
if(!inBound(nx, ny) || room[nx][ny] != 0) continue;
vacuum.x = nx;
vacuum.y = ny;
needToClean = true;
break;
}
// 2번 작업
if(!needToClean) {
int backDir = (vacuum.d+2) % 4;
int nx = vacuum.x + dx[backDir];
int ny = vacuum.y + dy[backDir];
// 2-2번 작업
if(!inBound(nx, ny) || room[nx][ny] == 1) break;
else{
vacuum.x = nx;
vacuum.y = ny;
}
}
}
}
static boolean inBound(int x, int y){
return !(x < 0 || y < 0 || x >= n || y >= m);
}
static void print(){
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(room[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
}