풀이
단순 구현인데 문제 이해 하는데에 시간을 많이 썼다.
반시계방향으로 90도 회전하며 주위 네 칸 중 청소가 되어 있지 않은 칸을 탐색하고, 청소가 되어 있다면 해당 칸으로 이동한다.
주위 네 칸 모두 청소를 할 수 없는 상황이라면 (벽 또는 이미 청소가 되어 있을 경우) 방향을 바꾸지 않고 그대로 한 칸 후진한다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 방 크기
int M = Integer.parseInt(st.nextToken());
int [][] arr = 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()); // 방향
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());
}
}
int ans = 0;
boolean working = true;
while (working) {
if (arr[r][c] == 0) { // 청소 되어 있지 않은 칸 -> 청소하기
arr[r][c] = 10; // 청소된 상태 : 10
ans += 1;
}
if ((arr[r-1][c] == 0) || (arr[r][c-1] == 0)
|| (arr[r+1][c] == 0) || (arr[r][c+1] == 0)) { // 주변 4칸 중 청소되지 않은 곳이 있는 경우
switch (d) {
case 0:
if (arr[r][c-1] == 0) { // 반시계방향으로 90도 회전한 방향의 앞 칸이 청소가 되어있지 않을 경우
c -= 1; // 좌표 변경
}
d = 3; // 방향 변경
break;
case 1:
if (arr[r-1][c] == 0) {
r -= 1;
}
d = 0;
break;
case 2:
if (arr[r][c+1] == 0) {
c += 1;
}
d = 1;
break;
case 3:
if (arr[r+1][c] == 0) {
r += 1;
}
d = 2;
break;
}
} else { // 청소되지 않은 빈칸이 없을 경우
switch (d) {
case 0:
if (arr[r+1][c] == 1) { // 후진 시 뒤쪽 칸이 벽일 경우
working = false; // 작동 멈춤
} else {
r += 1;
} break;
case 1:
if (arr[r][c-1] == 1) {
working = false;
} else {
c -= 1;
} break;
case 2:
if (arr[r-1][c] == 1) {
working = false;
} else {
r -= 1;
} break;
case 3:
if (arr[r][c+1] == 1) {
working = false;
} else {
c += 1;
} break;
}
}
}
System.out.println(ans);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2606: 바이러스 (JAVA) (1) | 2024.02.26 |
---|---|
[백준] 1260: DFS와 BFS (JAVA) (1) | 2024.02.26 |
[백준] 17413: 단어 뒤집기 2 (JAVA) (2) | 2024.02.25 |
[백준] 2979: 트럭 주차 (JAVA) (0) | 2024.02.25 |
[백준] 10866: 덱 (JAVA) (0) | 2024.01.26 |