굥뷰를 햡시댜

[BOJ-14503] 로봇청소기 본문

알고리즘 문제 풀이/BOJ 문제 풀이

[BOJ-14503] 로봇청소기

GodZ 2019. 7. 26. 21:42

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

모 기업 코딩테스트 기출 문제..

 

시뮬레이션 문제로 그냥 문제에서 하라는대로 구현만 해주면 된다.

 

비교적 쉬운 난이도였고 나같은 경우는 난독증 + 제 멋대로 해석 때문에 이상한 부분에 핀트가 꽂혀 시간이 오래 걸렸다..

 

-풀이 방법

1. 입력을 받는다.

 

2. 로봇청소기가 계속 이동하기 때문에 더이상 이동 불가능할 때 해제해주는 무한루프를 하나 만들어준다.

 

3. 로봇청소기가 현재 보는 방향의 왼쪽 방향을 순서대로 검사해야하기 때문에 for문으로 4번 반복해서 검사하게 해준다.

 

4. 현재 바라보는 방향에 따라 왼쪽 방향을 정해주고 그 방향으로 이동시킨다. (이동 불가능할 경우 방향만 바꿔준다)

 

5. 문제 조건에서 4방향 모두 이동이 불가능할 경우 현재 바라보는 방향을 기준으로 한 칸 뒤로 이동해준다.

 

6. 무한루프가 걸려있기 때문에 1 ~ 5번을 반복할 것이고 더이상 로봇청소기가 후진이 불가능한 상황이 오면 반복문은 종료된다.

 

7. clean이라는 배열에 입력된 1의 갯수를 카운트해서 청소한 부분의 갯수를 구하고 출력한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

struct ROBOT {
	int y, x, dir;
};
int n, m;
int clean_cnt;
int map[51][51];
int clean[51][51];
ROBOT robot;
const int dy[] = { -1,1,0,0 };
const int dx[] = { 0,0,-1,1 };

int main(void) {

	scanf("%d %d", &n, &m);
	scanf("%d %d %d", &robot.y, &robot.x, &robot.dir);

	for (int y = 0; y < n; y++) {
		for (int x = 0; x < m; x++) {
			scanf("%d", &map[y][x]);
		}
	}
	
	while (1) {

		clean[robot.y][robot.x] = 1;

		bool flag = false;

		for (int i = 0; i < 4; i++) {
			if (robot.dir == 0) {
				if (map[robot.y][robot.x - 1] == 0 && clean[robot.y][robot.x - 1] == 0) {
					flag = true;
					robot.dir = 3, robot.x -= 1;
					break;
				}
				else {
					robot.dir = 3;
				}
			}
			else if (robot.dir == 1) {
				if (map[robot.y - 1][robot.x] == 0 && clean[robot.y - 1][robot.x] == 0) {
					flag = true;
					robot.dir = 0, robot.y -= 1;
					break;
				}
				else {
					robot.dir = 0;
				}
			}
			else if (robot.dir == 2) {
				if (map[robot.y][robot.x + 1] == 0 && clean[robot.y][robot.x + 1] == 0) {
					flag = true;
					robot.dir = 1, robot.x += 1;
					break;
				}
				else {
					robot.dir = 1;
				}
			}
			else if (robot.dir == 3) {
				if (map[robot.y + 1][robot.x] == 0 && clean[robot.y + 1][robot.x] == 0) {
					flag = true;
					robot.dir = 2, robot.y += 1;
					break;
				}
				else {
					robot.dir = 2;
				}
			}
		}

		bool flag2 = false;
		if (!flag) {
			if (robot.dir == 0) {
				if (map[robot.y + 1][robot.x] == 1) {
					flag2 = true;
				}
				else {
					robot.y += 1;
				}
			}
			else if (robot.dir == 1) {
				if (map[robot.y][robot.x - 1] == 1) {
					flag2 = true;
				}
				else {
					robot.x -= 1;
				}
			}
			else if (robot.dir == 2) {
				if (map[robot.y - 1][robot.x] == 1) {
					flag2 = true;
				}
				else {
					robot.y -= 1;
				}
			}
			else if (robot.dir == 3) {
				if (map[robot.y][robot.x + 1] == 1) {
					flag2 = true;
				}
				else {
					robot.x += 1;
				}
			}
		}

		if (flag2) break;
	}
		

	int res = 0;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < m; x++) {
			if (clean[y][x] == 1) res += 1;
		}
	}

	printf("%d", res);

	getchar();
	getchar();

	return 0;
}

 

'알고리즘 문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ-14891] 톱니바퀴  (0) 2019.07.31
[BOJ-15686] 치킨배달  (0) 2019.07.26
[BOJ-17070] 파이프 옮기기1  (0) 2019.07.19
[BOJ-16236] 아기상어  (0) 2019.07.18
[BOJ-16234] 인구이동  (0) 2019.07.17
Comments