백준🔗
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
문제
간단 풀이
요새 백준 문제집 '삼성 SW 역량 테스트 기출 문제'에 있는 문제들을 푸는 중이다. 아무래도 구현 문제가 많은 것 같은데, 오늘 문제도 문제에서 주어진 조건에 따라 차근차근 구현해 나가니 쉽게 풀 수 있었다.
그래서 따로 풀이를 적을 내용은 없는 것 같지만, 한 가지만 얘기해보자면 문제에서 입력 부분에
'방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다.'
라는 조건이 있다. 처음에는 무슨 소리인지 잘 이해가 안 되었는데 방의 가장자리는 모두 벽으로 이루어져 있다는 얘기였다!! 로봇청소기는 벽이 있는 곳은 갈 수 없기 때문에 자연스럽게 최대 이동 범위가 배열을 벗어나지 않게 된다. 따라서 코드를 구현할 때 범위 체크는 따로 해주지 않았다.
코드
import java.io.*;
import java.util.*;
public class Main {
// 상우하좌
static int[] dr = { -1, 0, 1, 0 };
static int[] dc = { 0, 1, 0, -1 };
static int[][] room;
static int N, M;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 방 크기 입력
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
// 로봇 청소기 위치, 방향 입력 (0 : 북쪽 / 1 : 동쪽 / 2 : 남쪽 / 3 : 서쪽)
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 : 청소된 칸)
room = new int[N][M];
for (int r = 0; r < N; r++) {
st = new StringTokenizer(br.readLine());
for (int c = 0; c < M; c++) {
room[r][c] = Integer.parseInt(st.nextToken());
}
}
// 청소 시작!
int cnt = 0; // 청소하는 칸의 개수
here: while (true) {
// 1. 현재 칸이 아직 청소되지 않은 경우
if (room[R][C] == 0) {
room[R][C] = 2; // 현재 칸 청소
cnt++;
}
// 2. 주변이 전부 청소된 경우
if (allCleaned(R, C)) {
// 방향 유지하며 한 칸 후진
R -= dr[D];
C -= dc[D];
if (room[R][C] == 1) // 벽이라 후진할 수 없으면 중지
break here;
} else { // 3. 청소되지 않은 칸이 있는 경우
// 반시계 방향으로 90도 회전
D = (D + 3) % 4;
if (room[R + dr[D]][C + dc[D]] == 0) { // 청소되지 않은 경우
// 한 칸 전진
R += dr[D];
C += dc[D];
}
}
}
System.out.println(cnt);
}
static boolean allCleaned(int R, int C) {
for (int d = 0; d < 4; d++) {
int RR = R + dr[d];
int CC = C + dc[d];
if (room[RR][CC] == 0)
return false;
}
return true;
}
}