본문 바로가기
algorithm/ACMICPC

로봇 청소기 - 14503

by 에어컨조아 2019. 12. 25.

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

코드 : 

#include <iostream>

using namespace std;

int N, M;
int R, C, D;
int num[50][50] = { 0 };
int clearCount = 0;

std::pair<int,int> SelectDirection(int d)
{
	std::pair<int, int> temp;
	switch (d)
	{
	case 0:
		temp.first = 0;
		temp.second = -1;
		break;
	case 1:
		temp.first = -1;
		temp.second = 0;
		break;
	case 2:
		temp.first = 0;
		temp.second = 1;
		break;
	case 3:
		temp.first = 1;
		temp.second = 0;
		break;
	}
	return temp;
}
//회전
int Rotation(int d)
{
	d -= 1;
	if (d < 0)
	{
		d = 3;
	}
	return d;
}

void solution(int r, int c, int d)
{
	while (true)
	{
		//청소
		if (num[r][c] == 0)
		{
			num[r][c] = 2;
			clearCount++;
		}
			
		bool failCheck = true;
		//동서남북 확인
		for (int i = 0; i < 4; i++)
		{
			//방향에 따른 이동거리
			auto v = SelectDirection(d);

			int n = r + v.first;
			int m = c + v.second;

			//회전
			d = Rotation(d);
			if ((n >= 0 && n < N) && m >= 0 && m < M)
			{
				//청소가능지 파악
				if (num[n][m] == 0)
				{
					//이동
					r += v.first;
					c += v.second;
					failCheck = false;
					break;
				}
			}
		}
		//사방이 벽이거나 청소가 된 경우
		if (failCheck)
		{
			switch (d)
			{
			case 0:
				r += 1;
				break;
			case 1:
				c -= 1;
				break;
			case 2:
				r -= 1;
				break;
			case 3:
				c += 1;
				break;
			}
			if ((r < 0 || r > N) || (c <0 || c > M))
			{
				return;
			}
			//벽을 만났을때
			if (num[r][c] == 1)
			{
				return;
			}
		}
	}
}

int main()
{
	cin >> N >> M;
	cin >> R >> C >> D;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cin >> num[i][j];
		}
	}

	solution(R, C, D);
	cout << clearCount << "\n";
	return 0;
}

시뮬레이션 문제를 처음 풀어보았다. 생각보다 재미있는 문제였고 지문을 꼼꼼하게 읽어야함을 느꼈다...

나같은 경우 후진할때 벽을 만났을 경우를 빼먹어서 처음 실패를 맞보았다...

다행이 금방 찾아서 다행이었다.

지문을 잘 읽좌~~!!!!

'algorithm > ACMICPC' 카테고리의 다른 글

주사위 윷놀이 - 17825  (0) 2020.01.31
원판 돌리기 - 17822  (0) 2020.01.24
연구소 - 14502  (0) 2019.12.25
N-Queen - 9663  (0) 2019.12.23
테트로미노 - 14500 (Solve 2)  (0) 2019.12.14

댓글