본문 바로가기

Computer Science&Engineering/코딩테스트

[ 백준 14503 ] 로봇 청소기

# 문제링크

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

문제가 잘 읽히지 않아서 애를 먹었지만, 설명에 나온 그대로만 구현하니 패스가 되었네요. 로봇은 x, y 좌표와 방향을 저장할 수 있도록 struct 로 구성했고, 왼쪽으로 가는 방향이나 후진 방향 정하는 거는 그냥 배열로 적어주었습니다. 왼쪽으로 가는 방향은 그냥 -1 만 해줘도 되었을 것 같네요. 

 

# 제출 코드 

 

#include <cstdio>
using namespace std;

int N, M;
int map[51][51];
struct st {
	int y;
	int x;
	int d;
};
st robot;

// 0 : 북쪽, 1 : 동쪽, 2: 남쪽, 3: 서쪽
int xd[] = { 0,1, 0, -1 };
int yd[] = { -1, 0, 1, 0 };

void Input() {
	scanf("%d %d", &N, &M);
	
	scanf("%d %d %d", &robot.y, &robot.x, &robot.d);

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &map[i][j]);
		}
	}
}

int dir[] = { 3, 0, 1, 2 }; // 현재 방향 기준으로 왼쪽
int back[] = { 2, 3, 0, 1 }; // 후진하는 방향
int Simul(){
	int ans = 0;
	bool flag;
	while (true) {
		flag = false;
		if (map[robot.y][robot.x] == 0) {
			map[robot.y][robot.x] = 2; // 현재 위치 청소
			ans++;
		}
		for (int i = 0; i < 4; i++) {
			int nd = dir[robot.d]; // 현재 방향을 기준으로 왼쪽
			int ny = robot.y + yd[nd];
			int nx = robot.x + xd[nd];

			if (map[ny][nx] == 0) {
				robot.d = nd;
				robot.y = ny;
				robot.x = nx;
				flag = true;
				break;
			}
			else {
				robot.d = nd;
			}
		}

		if (flag) continue;
		else {
			// 네 방향 모두 청소가 되어있거나 벽인 경우 후진
			int nd = back[robot.d];
			int ny = robot.y + yd[nd];
			int nx = robot.x + xd[nd];

			if (map[ny][nx] == 1) return ans; //후진도 못하면 리턴
			else { 
				robot.y = ny;
				robot.x = nx;
			}
		}
	}
	return ans;
}
int main() {
	Input();
	printf("%d\n", Simul());
}
반응형