알고리즘/백준

[백준] 14503: 로봇 청소기 (JAVA)

김호록님 2024. 2. 26. 16:39

풀이

단순 구현인데 문제 이해 하는데에 시간을 많이 썼다.

반시계방향으로 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