백준 로봇 청소기

KIMYEONGJUN·2026년 3월 3일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 방의 크기 N과 M이 입력된다.(3 ≤ N, M ≤ 50)
둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 (r, c)$와 처음에 로봇 청소기가 바라보는 방향 d가 입력된다.
d가 0인 경우 북쪽, 1인 경우 동쪽, 2인 경우 남쪽, 3인 경우 서쪽을 바라보고 있는 것이다.
셋째 줄부터 N개의 줄에 각 장소의 상태를 나타내는 N x M개의 값이 한 줄에 M개씩 입력된다.
i번째 줄의 j번째 값은 칸 (i, j)의 상태를 나타내며, 이 값이 0인 경우 (i, j)가 청소되지 않은 빈 칸이고, 1인 경우 (i, j)에 벽이 있는 것이다.
방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다.
로봇 청소기가 있는 칸은 항상 빈 칸이다.

로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리
첫 줄에 방 크기 N, M을 읽고,
둘째 줄에 로봇 초기 좌표 (r,c), 초기 방향 d를 읽는다.
이후 N줄에 방 상태를 저장한다.
방 상태 배열 room과 청소 여부 배열 cleaned 생성
room[i][j]는 벽(1) 혹은 빈 칸(0)
cleaned[i][j]는 청소 완료 여부(true/false) 표시
이동 방향 배열 dr, dc
북, 동, 남, 서 방향별 행, 열 변화량 저장한다.
청소 로직
현재 위치가 청소되지 않았다면 청소 후 카운트 증가
반시계 방향으로 4개 방향 탐색하면서 청소 가능 칸 발견 시 전진
못 찾으면 뒤로 한 칸 후진 가능 여부 확인
후진도 불가능하면 종료한다.

코드로 구현

package baekjoon.baekjoon_33;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

// 백준 14503번 문제
public class Main1316 {
    static int N, M;
    static int[][] room;
    static boolean[][] cleaned;
    // 방향: 0=북, 1=동, 2=남, 3=서
    static int[] dr = {-1, 0, 1, 0}; // 행 이동: 북, 동, 남, 서
    static int[] dc = {0, 1, 0, -1}; // 열 이동: 북, 동, 남, 서

    static int r, c, d;

    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());

        room = new int[N][M];
        cleaned = 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++) {
                room[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        System.out.println(cleanRoom());
        br.close();
    }

    static int cleanRoom() {
        int cleanedCount = 0;

        while (true) {
            // 1) 현재 칸 청소
            if (!cleaned[r][c]) {
                cleaned[r][c] = true;
                cleanedCount++;
            }

            boolean moved = false;

            // 2) 반시계 방향 4칸 검사
            for (int i = 0; i < 4; i++) {
                d = (d + 3) % 4; // 왼쪽(반시계)으로 방향 전환
                int nr = r + dr[d];
                int nc = c + dc[d];

                // 청소 안된 빈 칸이면 전진
                if (nr >= 0 && nr < N && nc >=0 && nc < M
                        && room[nr][nc] == 0 && !cleaned[nr][nc]) {
                    r = nr;
                    c = nc;
                    moved = true;
                    break;
                }
            }

            if (moved)
                continue; // 전진했으면 다시 1번부터 반복

            // 3) 주변 4칸 중 청소할 곳 없으면 후진 가능 확인
            int backDir = (d + 2) % 4; // 뒤쪽 방향
            int brBack = r + dr[backDir];
            int bcBack = c + dc[backDir];

            if (brBack >= 0 && brBack < N && bcBack >= 0 && bcBack < M
                    && room[brBack][bcBack] == 0) {
                r = brBack;
                c = bcBack;
            } else {
                // 후진 못하면 종료
                break;
            }
        }
        return cleanedCount;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글