Skip to content

Commit 55c8d9c

Browse files
committed
[Gold V] Title: 로봇 청소기, Time: 108 ms, Memory: 14412 KB -BaekjoonHub
1 parent 0ebcf58 commit 55c8d9c

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# [Gold V] 로봇 청소기 - 14503
2+
3+
[문제 링크](https://www.acmicpc.net/problem/14503)
4+
5+
### 성능 요약
6+
7+
메모리: 14412 KB, 시간: 108 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 8월 25일 17:08:11
16+
17+
### 문제 설명
18+
19+
<p>로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.</p>
20+
21+
<p>로봇 청소기가 있는 방은 $N \times M$ 크기의 직사각형으로 나타낼 수 있으며, $1 \times 1$ 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 $(r, c)$로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 $(0, 0)$, 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 $(N-1, M-1)$이다. 즉, 좌표 $(r, c)$는 북쪽에서 $(r+1)$번째에 있는 줄의 서쪽에서 $(c+1)$번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.</p>
22+
23+
<p>로봇 청소기는 다음과 같이 작동한다.</p>
24+
25+
<ol>
26+
<li>현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.</li>
27+
<li>현재 칸의 주변 $4$칸 중 청소되지 않은 빈 칸이 없는 경우,
28+
<ol>
29+
<li>바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.</li>
30+
<li>바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.</li>
31+
</ol>
32+
</li>
33+
<li>현재 칸의 주변 $4$칸 중 청소되지 않은 빈 칸이 있는 경우,
34+
<ol>
35+
<li>반시계 방향으로 $90^\circ$ 회전한다.</li>
36+
<li>바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.</li>
37+
<li>1번으로 돌아간다.</li>
38+
</ol>
39+
</li>
40+
</ol>
41+
42+
### 입력
43+
44+
<p>첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽, $1$인 경우 동쪽, $2$인 경우 남쪽, $3$인 경우 서쪽을 바라보고 있는 것이다.</p>
45+
46+
<p>셋째 줄부터 $N$개의 줄에 각 장소의 상태를 나타내는 $N \times M$개의 값이 한 줄에 $M$개씩 입력된다. $i$번째 줄의 $j$번째 값은 칸 $(i, j)$의 상태를 나타내며, 이 값이 $0$인 경우 $(i, j)$가 청소되지 않은 빈 칸이고, $1$인 경우 $(i, j)$에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.</p>
47+
48+
### 출력
49+
50+
<p>로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.</p>
51+
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
//북동남서
7+
static int dx[] = {-1, 0, 1, 0};
8+
static int dy[] = {0, 1, 0, -1};
9+
static class Point{
10+
int x;
11+
int y;
12+
13+
Point(int x, int y){
14+
this.x = x;
15+
this.y= y;
16+
}
17+
}
18+
19+
public static void main(String[] args) throws IOException{
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
StringTokenizer st = new StringTokenizer(br.readLine());
22+
23+
24+
int N = Integer.parseInt(st.nextToken());
25+
int M = Integer.parseInt(st.nextToken());
26+
27+
int[][] room = new int[N][M];
28+
int[][] visited = new int[N][M];
29+
30+
st = new StringTokenizer(br.readLine());
31+
32+
int x = Integer.parseInt(st.nextToken());
33+
int y = Integer.parseInt(st.nextToken());
34+
35+
Point point = new Point(x, y);
36+
int dir = Integer.parseInt(st.nextToken());
37+
38+
for(int i=0; i<N; i++){
39+
st = new StringTokenizer(br.readLine());
40+
for(int j=0; j<M; j++){
41+
room[i][j] = Integer.parseInt(st.nextToken());
42+
}
43+
}
44+
45+
int totalCnt = 0;
46+
47+
while(true){
48+
if(room[point.x][point.y] == 0){
49+
room[point.x][point.y] = 2; //청소 안되어있으면 청소
50+
totalCnt++;
51+
}
52+
53+
boolean flag = false;
54+
55+
for(int i=0; i<4; i++){ //주변 4칸 탐색
56+
dir = (dir+3)%4; // 왼쪽으로 회전
57+
58+
int newX = point.x + dx[dir];
59+
int newY = point.y + dy[dir];
60+
61+
// 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 회전 후 한칸 전진
62+
if (newX >= 0 && newX < N && newY >= 0 && newY < M && room[newX][newY] == 0) {
63+
// 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
64+
point.x = newX;
65+
point.y = newY;
66+
flag = true;
67+
break;
68+
}
69+
70+
//청소 할 공간이 없으면 1번으로 돌아감
71+
}
72+
73+
if(!flag){ //4방향 모두 청소할 곳이 없다면
74+
// 뒤쪽 칸이 벽인지 확인
75+
int back_d = (dir + 2) % 4; // 현재 방향의 뒤쪽 방향
76+
int newX = point.x + dx[back_d];
77+
int newY = point.y + dy[back_d];
78+
79+
// 뒤쪽이 벽이 아니라면 후진
80+
if (newX >= 0 && newX < N && newY >= 0 && newY < M && room[newX][newY] != 1) {
81+
point.x = newX;
82+
point.y = newY;
83+
}
84+
// 뒤쪽 칸이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
85+
else {
86+
break;
87+
}
88+
}
89+
90+
}
91+
92+
System.out.println(totalCnt);
93+
}
94+
95+
96+
}

0 commit comments

Comments
 (0)