본문 바로가기

Problem Solving/Algorithm Training

[Baekjoon] 14503 - 로봇 청소기 (C++)

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net

생각보다 크게 어려웠던 문제는 아니었습니다. 로봇 청소기의 작동 조건이 문제에 명확하게 나와있었기 때문에 이를 그대로 코딩으로 구현하기만 하면 쉽게 풀 수 있다고 생각합니다. 또한 로봇 청소기가 무조건 왼쪽부터 탐색한다는 점도 있어서 쉽게 구현할 수 있었던 것 같습니다.

#include <iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int map[50][50];
	int clean = 0;
	int n, m, r, c, d;
	cin >> n >> m >> r >> c >> d;

	// 지도 입력
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < m; x++) {
			cin >> map[y][x];
		}
	}

	// 방향 정보 (북, 동, 남, 서)
	int dx[4] = { 0, 1, 0, -1 };
	int dy[4] = { -1, 0, 1, 0 };

	while (true) {
		// 현재 위치를 청소
		if (map[r][c] == 0) {
			map[r][c] = 2;
			clean++;
		}

		// 네 방향 모두 청소가 되어있거나 벽인 경우
		if (map[r - 1][c] && map[r + 1][c] && map[r][c - 1] && map[r][c + 1]) {
			if (map[r - dy[d]][c - dx[d]] == 1) {
				break;
			}

			// 한 칸 후진
			r -= dy[d];
			c -= dx[d];
		}
		else {
			d = d == 0 ? 3 : d - 1;

			// 한 칸 전진
			if (map[r + dy[d]][c + dx[d]] == 0) {
				r += dy[d];
				c += dx[d];
			}
		}
	}

	cout << clean << "\n";
	return 0;
}