본문 바로가기
백준

[14503] 로봇 청소기

by kmyobin 2023. 4. 7.


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

댓글