Min:D's Devlog

[백준][삼성 SW 역량 테스트][Gold 5][C++] 14503 로봇 청소기 본문

알고리즘/백준

[백준][삼성 SW 역량 테스트][Gold 5][C++] 14503 로봇 청소기

Min:D 2020. 10. 2. 19:00

문제

백준 삼성 SW 역량 테스트 기출문제 - 14503 로봇 청소기 (Gold 5)

 

14503번: 로봇 청소기

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

www.acmicpc.net

 


문제 풀이

접근 방식

로봇 청소기가 아래와 같이 작동할 때, 청소하는 영역의 개수를 구하는 문제이다.

 

로봇 청소기의 작동 방식

 

이 문제는 위의 작동 방식대로 로봇 청소기를 구현하는 시뮬레이션 문제였다.

그래서 while문을 사용하여 조건대로 구현해주었다.

 

우선, 현 위치의 값이 0이면(청소가 되어있지 않으면)  값을 2로 바꿔주고 answer++를 수행하였다.

그 후, 네 방향을 왼쪽부터 탐색하며 다음으로 청소해야 할 곳으로 이동해주었다.

 

네 방향 모두 청소가 되어 있거나인 경우에는,

현재 보는 방향에서 2를 빼서 보는 방향의 반대 방향으로 이동해주었다.

이동한 곳이 벽인 경우에는 while문을 종료하고, 답을 출력해주었다.

 


풀이 코드 - C++

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int N, M, x, y, d;
	cin >> N >> M >> x >> y >> d;
	vector<vector<int>> map(N, vector<int>(M));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++)	{
			cin >> map[i][j];
		}
	}
	
	int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };	// 북 동 남 서

	int answer = 0;
	while(1) {
		if (map[x][y] == 0) {
			map[x][y] = 2;
			answer++;
		}

		bool check = true;
		for (int i = 0; i < 4; i++) {
			if (d == 0) d = 4;
			d--;
			int nx = x + dir[d][0];
			int ny = y + dir[d][1];
			if (map[nx][ny] == 1) continue;
			else if (map[nx][ny] == 0) {
				x = nx;
				y = ny;
				check = false;
				break;
			}
		}
		if (check) {	// 후진
			int back = d - 2;
			if (back < 0) back += 4;
			x += dir[back][0];
			y += dir[back][1];
			if (map[x][y] == 1)	// 뒤가 벽인 경우 종료
				break;
		}
	}
	cout << answer;
}

실행 결과

실행 결과 : 통과 (0ms)

Comments