📌 문제
📍 제출 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static int r;
static int c;
static int d;
static int[][] arr;
static boolean[][] clean;
static int[] dx = {-1, 0, 1, 0}; // 북, 동, 남, 서
static int[] dy = {0, 1, 0, -1};
public static void robot(int x, int y, int idx) {
while(true) {
clean[x][y] = true;
// 사방으로 둘러보며 청소할 빈 칸 있는지 탐색
int flag = 0;
for(int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(arr[nx][ny]==0 && clean[nx][ny]==false) { // 청소할 곳 있으면
flag = 1; // 표시
}
}
if(flag == 0) { // 청소할 곳 없으면
// 후진했을 때, 청소는 했지만 빈칸인 곳 있으면
if(arr[x-dx[idx]][y-dy[idx]]==0 && clean[x-dx[idx]][y-dy[idx]]==true) {
x -= dx[idx]; // 좌표 후진
y -= dy[idx]; // 좌표 후진
}else{ // 후진 하려는데 벽으로 막혀있다?
break; // 종료
}
}else { // 청소할 곳 있으면
idx = (idx + 3) % 4; // 반시계로 90도 회전
// 빈칸이고 아직 청소안한 곳
if(arr[x+dx[idx]][y+dy[idx]]==0 && clean[x+dx[idx]][y+dy[idx]]==false) {
x += dx[idx]; // 앞으로(현재 dir) 이동
y += dy[idx]; // 앞으로(현재 dir) 이동
}
}
}
}
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()); // 방 크기
arr = new int[N][M];
clean = new boolean[N][M];
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken()); // 로봇 청소기 처음 위치 행
c = Integer.parseInt(st.nextToken()); // 로봇 청소기 처음 위치 열
d = Integer.parseInt(st.nextToken()); // 로봇 청소기가 바라보는 방향
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
robot(r, c, d);
int cnt = 0;
for(boolean[] r : clean) {
for(boolean c : r) {
if(c == true) {
cnt++;
}
}
}
System.out.println(cnt);
}
}
📝 풀이
이해하지 못했던 부분
문제에서 주어진 그대로 구현하는 게 중요했던 문제다.
1. 4칸 탐색을 로봇 청소기가 하는 게 아니라 탐색을 해서 알려주어야 했다.
2. 빈칸이 나올때까지 90도 회전이 아니라 그냥 90도 회전해서 없으면 1로 돌아가고 있으면 한칸 이동해야 했다.
새로 알게된 부분
- 좌표 후진은 idx를 그냥 빼주면 된다.
x -= dx[idx]; // 좌표 후진
y -= dy[idx]; // 좌표 후진
- 반시계로 회전하는 idx 만들기
idx = (idx + 3) % 4; // 반시계로 90도 회전