https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
단순한 구현 문제인데 좀 조건이 복잡하다.
대신 작동 조건 순서대로 구현하면 문제 없다.
일단 작동을 멈추는 조건은 딱 한 가지이다.
뒤쪽 칸이 벽이라서 후진이 불가능할 때만 멈춘다.
이에 관련해서만 break를 걸어주고 while문으로 반복하면 된다.
일단 현재 칸이 청소되어있는지 따지는게 첫번째,
그 다음 주변 4칸(동, 서, 남, 북)이 청소되어있는지 따지는게 두번째이다.
주변 4칸 중에 하나라도 청소되어있지 않다면 반시계 90도 회전을 한 다음 이동한다.
주변 4칸이 모두 청소되어있거나 벽으로 가로막혀 있다면 후진한다.
이 때 후진을 못한다면 break로 빠져나오면 된다.
문제에 나와있는 조건 순서대로 코드를 구성하면 된다.
#include <iostream>
using namespace std;
#define MAX 51
int N, M, r, c, d;
int A[MAX][MAX];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
cin >> r >> c >> d;
// d=0 : 북쪽, d=1 : 동쪽, d=2 : 남쪽, d=3 : 서쪽
// 로봇 청소기가 있는 곳은 항상 빈 칸
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> A[i][j];
// 0이면 청소 안 되어있음
// 1이면 벽있음
}
}
int sum = 0;
// 작동을 멈추는 경우는 딱 한 가지 : 뒤쪽 칸이 벽이라 후진할 수 없을 때
int i = r; int j = c;
while (1) {
if (A[i][j] == 0) { // 현재 칸이 청소되지 않은 경우
A[i][j] = 2; // 청소한 곳은 2로 설정
sum++;
}
// 이제 주변 4칸을 보자
if (A[i - 1][j] == 0 || A[i + 1][j] == 0 || A[i][j - 1] == 0 || A[i][j + 1] == 0) {
// 청소되지 않은 빈 칸이 있는 경우
// 반시계 방향으로 90도 회전
d = (d == 0) ? 3 : d - 1;
if (d == 0) {
// 북쪽인 경우
if (A[i - 1][j] == 0) i--;
}
else if (d == 1) {
// 동쪽인 경우
if (A[i][j + 1] == 0) j++;
}
else if (d == 2) {
// 남쪽인 경우
if (A[i + 1][j] == 0) i++;
}
else {
// 서쪽인 경우
if (A[i][j - 1] == 0) j--;
}
}
else {
// 모두 청소되어 있다면 후진
if (d == 0) { // 북쪽
if (A[i + 1][j] != 1) i++;
else break;
}
else if (d == 1) { // 동쪽
if (A[i][j - 1] != 1) j--;
else break;
}
else if (d == 2) { // 남쪽
if (A[i - 1][j] != 1) i--;
else break;
}
else { // 서쪽
if (A[i][j + 1] != 1) j++;
else break;
}
}
}
cout << sum;
}
'백준' 카테고리의 다른 글
[15686] 치킨 배달 (0) | 2023.04.10 |
---|---|
[14891] 톱니바퀴 (0) | 2023.04.08 |
[13458] 시험 감독 (0) | 2023.04.06 |
[14501] 퇴사 (0) | 2023.04.05 |
[11444] 피보나치 수 6 (0) | 2023.02.08 |
댓글