본문 바로가기
SWE/코테

[성실코딩 26일차] 백준 #14503 로봇 청소기

by S나라라2 2018. 11. 26.
반응형

시뮬레이션 문제인가? 

딱히 어려운 알고리즘이 필요한 문제는 아니다.


현재 바라보는 방향(동,서,남,북)에 따라 이동하거나 회전하여 확인하는 방향이 달라지는 것만 고려해서 구현하면 된다.


구현 코드


#include < iostream >

using namespace std;

int map[51][51] = { 0, };

int n, m;  // map의 세로 N, 가로 크기 M
int r, c, d; // 현재 위치 (r,c) 방향 d
int cnt = 0;

void func() {
	// 1. 현재 위치 청소, 방문 표시
	if (map[r][c] == 0) {
		cnt++;
		map[r][c] = -1;
	}
	
	// 2. 현재 방향 기준으로 왼쪽으로 회전하며 
	//		이동(청소) 가능한지 확인
	bool moveFlag = false;
	for (int i = 0; i < 4; i++) {
		switch (d) // 방향
		{
		case 0: // 북
			// boundary check && 청소 가능
			if ( c-1 >= 0 && map[r][c-1]==0) {
				c = c - 1;
				moveFlag = true;
			}
			break;
		case 1: // 서
			// boundary check && 청소 가능
			if (r + 1 < n && map[r + 1][c] == 0) {
				r = r + 1;
				moveFlag = true;
			}
			break;
		case 2: // 남
			// boundary check && 청소 가능
			if ( c+1 < m && map[r][c+1] == 0) {
				c = c + 1;
				moveFlag = true;
			}
			break;
		case 3: // 동
			// boundary check && 청소 가능
			if (r - 1 >= 0 && map[r - 1][c] == 0) {
				r = r - 1;
				moveFlag = true;
			}
			break;
		}
		d = (d + 1) % 4;
		if (moveFlag==true) {
			// 4방향 중 이동할 수 있는 곳이 있음.
			// for문 빠져나오기
			break;
		}
	}
	// 3-1. 이동할 수 있다면 (청소할 곳이 있다면)
	if (moveFlag == true) {
		// 이미 r,c위치와 d를 변경했으므로
		// 그대로 방문
		func();
	}
	else { // 3-2. 네 방향 모두 청소되어있음.
		// 후진 가능한지 확인 
		switch (d) // 방향
		{
		case 0: // 북
			// boundary, 벽아닌지 체크 
			if ( r+1 < n && map[r+1][c] != 1) {
				r = r+1;
				func();
			}
			break;
		case 1: // 서
			// boundary, 벽아닌지 체크
			if ( c+1 < m && map[r][c+1] != 1) {
				c = c + 1;
				func();
			}
			break;
		case 2: // 남
			// boundary, 벽아닌지 체크
			if ( r-1 >= 0 && map[r-1][c] != 1) {
				r = r - 1;
				func();
			}
			break;
		case 3: // 동
			// boundary, 벽아닌지 체크
			if ( c-1 >= 0 && map[r][c-1] != 1) {
				c = c - 1;
				func();
			}
			break;
		}
		// 후진도 불가능함
		return;
	}

}

int main(void) {
	
	// 입력
	cin >> n >> m;
	cin >> r >> c >> d;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> map[i][j];
		}
	}

	// 문제에서 주어진 방향 : 북 동 남 서  0 1 2 3
	// 내가 가정 ( 반시계방향으로 확인 필요하기 때문) : 북 서 남 동 0 1 2 3
	if (d==1) {
		d = 3;
	}
	else if (d == 3) {
		d = 1;
	}

	// 현재 위치 청소 가능한지
	func();

	cout << cnt << endl;

	return 0;
}
반응형