
내가 생각했을때 문제에서 원하는부분
첫째 줄에 방의 크기 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;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.