Algorithm/Baekjoon Online Judge
[Java] BOJ14503_로봇 청소기
'지훈'
2021. 4. 19. 12:25
문제에 주어진 조건대로 구현하는 시뮬레이션 문제이다.
d라는 방향 값을 가지고 왼쪽 방향이 벽(값이 1)이거나 청소(값이 2)를 이미 했다면 방향을 회전시켜주고 방향을 몇 번 회전시켜주는지 나타내 주는 cnt를 증가시킨다.
cnt가 4가 될 경우 네방향 모두 벽이거나 청소를 했다는 것이기 때문에 후진을 할 수 있는지 판단한다.
후진 방향이 벽이면 반복문을 빠져나오고 그렇지 않은 경우 cnt를 0으로 초기화해주고 뒤로 이동한다.
import java.io.*;
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());
st= new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken()); //0북 1동 2남 3서
//1벽 0청소안한 땅 2청소한 땅
int[][] room = new int[N][M];
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());
}
}
int res = 0;
int cnt = 0;
while(true) {
if(room[r][c] == 0) {
room[r][c] = 2;
res++;
cnt = 0;
}
if(cnt==4) { //사방이 벽이면
if(d==0) {
if(room[r+1][c] == 1) break; //뒤쪽이 벽이면
else r++;
} else if(d==1) {
if(room[r][c-1] == 1) break; //뒤쪽이 벽이면
else c--;
} else if(d==2) {
if(room[r-1][c] == 1) break; //뒤쪽이 벽이면
else r--;
} else if(d==3) {
if(room[r][c+1] == 1) break; //뒤쪽이 벽이면
else c++;
}
cnt = 0;
continue;
}
if(d==0) {
if(room[r][c-1] == 1 || room[r][c-1] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
else c--;
d=3;
} else if(d==1) {
if(room[r-1][c] == 1 || room[r-1][c] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
else r--;
d=0;
} else if(d==2) {
if(room[r][c+1] == 1 || room[r][c+1] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
else c++;
d=1;
} else if(d==3) {
if(room[r+1][c] == 1 || room[r+1][c] == 2) cnt++; //왼쪽이 벽이거나 청소했다면
else r++;
d=2;
}
}
System.out.println(res);
}
}