🔺 문제
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
🧩 해결 아이디어
• 구현 & 시뮬레이션
1. 현재 칸의 주변 4칸 中 청소 안 된 빈 칸이 있는 경우, 반시계로 90도 회전하면서 주변을 청소할 수 있는지 확인한다.
- 청소 안 된 곳이 있으면, cnt + 1하고 현재 좌표에서 dfs를 수행한다.
for(int i = 0 ; i < 4 ; i++) {
dir = (dir + 3) % 4; // 반시계로 90도 회전
int nx = x + dx[dir];
int ny = y + dy[dir];
// 청소 안 된 곳 있으면, cnt++ & dfs
if(inRange(nx, ny) && map[nx][ny] == 0) {
cnt++;
dfs(nx, ny);
return; // ⭐ 여기서 종료 안 하면, 다른 곳 청소하러 갈 수도
}
}
2. 현재 칸의 주변 4칸 中 청소 안 된 빈 칸이 없는 경우 (= 주변이 모두 청소되어 있거나 벽인 경우),
한 칸 후진하고 그 위치에서 dfs를 수행한다.
int back = (dir + 2) % 4; // 반대 방향
int bx = x + dx[back];
int by = y + dy[back];
if(inRange(bx, by) && map[bx][by] != 1) {
dfs(bx, by);
}
💥 유의사항
- 청소한 칸 수는 1부터 시작한다. (시작 지점은 항상 청소 안 되어있다고 가정하므로)
- dx/dy 배열 순서를 "북 동 남 서" 순으로 저장해둬야 한다.
- 후진 시, x -= dx[dir] , y -= dy[dir]
이 아니라, 반대 방향으로 이동해야 한다.
(예를 들어 현재 방향이 북쪽을 보고 있다면 남쪽으로 이동)
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import java.util.*;
import java.io.*;
public class Main {
static int[] dx = {-1, 0, 1, 0}; // 북 동 남 서
static int[] dy = {0, 1, 0, -1};
static int N, M; // 방 크기
static int r, c; // 로봇 청소기 위치
static int dir; // 바라보는 방향
static int cnt = 1; // 청소한 칸 수 (시작 지점 때문에 1에서 시작)
static int[][] map;
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());
String[] str = br.readLine().split(" ");
r = Integer.parseInt(str[0]);
c = Integer.parseInt(str[1]);
dir = Integer.parseInt(str[2]);
map = new int[N][M];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j < M ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dfs(r, c);
System.out.println(cnt);
}
private static void dfs(int x, int y) {
// 1. 현재 칸 청소
map[x][y] = -1;
// 2. 현재 칸 주변 4칸 中 청소 안 된 빈 칸 있는 경우,
// 왼쪽 방향부터 차례대로 탐색 진행
for(int i = 0 ; i < 4 ; i++) {
dir = (dir + 3) % 4; // ⭐ 반시계로 90도 회전
int nx = x + dx[dir];
int ny = y + dy[dir];
// 청소 안 된 곳 있으면, cnt++ & dfs
if(inRange(nx, ny) && map[nx][ny] == 0) {
cnt++;
dfs(nx, ny);
return; // ⭐ 여기서 종료 안 하면, 다른 곳 청소하러 갈 수도
}
}
// 2. 네 방향 모두 청소가 이미 되어있거나 벽인 경우,
// 바라보는 방향 유지한 채 반대로 한 칸 후진
int back = (dir + 2) % 4; // ⭐ 반대 방향
int bx = x + dx[back];
int by = y + dy[back];
if(inRange(bx, by) && map[bx][by] != 1) {
dfs(bx, by);
}
}
private static boolean inRange(int x, int y) {
return (0 <= x && x < N && 0 <= y && y < M);
}
}
|
cs |
🔺 다른 풀이들
- 약간 내가 풀려고 했던 방식이랑 비슷하심!!!!
[백준] 14503 - 로봇 청소기 (java)
문제 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로
velog.io
💬 느낀 점
생각보다 코드가 간단해서 놀랐다.
크게 어려운 문제가 아닌 것 같은데 끝까지 마무리가 잘 안 된다ㅠ
복습해서 빠르게 풀 수 있게 해야지ㅠ
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[Java] 백준 14503 : 로봇 청소기
https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라
yeons4every.tistory.com
[백준] 14503번 - "로봇 청소기" (Java)
www.acmicpc.net/problem/14503 14503번: 로봇 청소기 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수
bbangson.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 16637번: 괄호 추가하기 (0) | 2023.12.14 |
---|---|
[백준/JAVA] 20207번: 달력 (0) | 2023.12.14 |
[백준/JAVA] 1913번: 달팽이 (0) | 2023.12.13 |
[백준/JAVA] 4396번: 지뢰 찾기 (0) | 2023.12.13 |
[백준/JAVA] 20546번: 🐜 기적의 매매법 🐜 (1) | 2023.12.11 |