로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 방은 크기의 직사각형으로 나타낼 수 있으며, 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 , 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 이다. 즉, 좌표 는 북쪽에서 번째에 있는 줄의 서쪽에서 번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.
로봇 청소기는 다음과 같이 작동한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int[] dx = { -1, 0, 1, 0 };
static int[] dy = { 0, -1, 0, 1 };
static int N, M, r, c, d;
static int[][] map;
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());
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
map = new int[N][M];
int cnt = 0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
while (true) {
if (map[r][c] == 0) { // 현재 칸 청소
map[r][c] = 2;
cnt++;
}
boolean flag = true;
for (int i = 1; i <= 4; i++) {
int k = d + i;
if (k >= 4) {
k %= 4;
}
int nx = r + dx[k];
int ny = c + dy[k];
if (nx < 0 || ny < 0 || nx >= N || ny >= M)
continue;
if (map[nx][ny] == 0) {
d = k;
r = nx;
c = ny;
flag = false;
break;
}
}
if (flag) {
int nx = r + dx[d] * -1;
int ny = c + dy[d] * -1;
if (nx < 0 || ny < 0 || nx >= N || ny >= M || map[nx][ny] == 1)
break;
else {
r = nx;
c = ny;
}
}
}
System.out.println(cnt);
}
}
idx가 시계이고 반시계 방향으로 어떻게 돌리지?
⇒ dx, dy는 시계 방향으로 적음
그리고 d를 -1 하면서 만약 -1이 되면 3으로 바꿈
이유: d가 0인 경우 → 돌려야 하는 방향 (3,2,1,0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int[] dx = { -1, 0, 1, 0 }; // 시계방향(북,동,남,서);
static int[] dy = { 0, 1, 0, -1 };
static int N, M, r, c, d;
static int[][] map;
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());
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
map = new int[N][M];
int cnt = 0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
while (true) {
if (map[r][c] == 0) { // 현재 칸 청소
cnt++;
map[r][c] = cnt + 1;
}
boolean flag = true;
for (int i = 0; i < 4; i++) {
d -= 1;
if (d == -1) {
d = 3;
}
int nx = r + dx[d];
int ny = c + dy[d];
if (nx < 0 || ny < 0 || nx >= N || ny >= M)
continue;
if (map[nx][ny] == 0) {
r = nx;
c = ny;
flag = false;
break;
}
}
if (flag) {
int nx = r + dx[d] * -1;
int ny = c + dy[d] * -1;
if (nx < 0 || ny < 0 || nx >= N || ny >= M || map[nx][ny] == 1)
break;
else {
r = nx;
c = ny;
}
}
}
System.out.println(cnt);
}
}