본문 바로가기
🥇Baekjoon Solutions/삼성SW 기출

[C++] 백준 14503번: 로봇 청소기(삼성SW기출)

by 코푸는 개발자 2021. 10. 24.
728x90

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

조건
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하기
현재 방향을 기준으로 왼쪽 방향부터 차례대로 인접 칸 탐색
청소하지 않은 칸 발견까지 왼쪽 회전
청소하지 않은 칸 발견하면 해당 방향으로 1칸 전진
모든 방향이 모두 청소 되었다면 바라보는 방향 유지하며 한칸 후진
모든 방향 모두 청소 되어있고 뒤쪽방향이 벽이라면 동작 종료
이미 청소되어 있는 칸을 또 청소하지 않음(재방문x)
입력: N M(3~50)
로봇청소기 위치 r c d (r,c) 방향 d(0북, 1동, 2남, 3서)
장소의 상태 0:빈칸, 1:벽(테두리는 모두 벽)
출력: 로봇 청소기가 청소한 칸의 개수 출력

진행순서 1. 현재 위치 청소 -> 2. 조건에 따라 이동

#include <iostream>

using namespace std;

int board[51][51];
bool check[51][51];

//북, 동, 남, 서(오른쪽 회전) 방향에 주의해야함
int idr[4] = { -1,0,1,0 };
int idc[4] = { 0,1,0,-1 };
int answer = 0;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int N, M, r, c, d;

	cin >> N >> M;
	cin >> r >> c >> d;
	
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++)
			cin >> board[i][j];
	}

	// 테두리 부분은 모두 1이 나오기 때문에 전체 유효성 검사x
	while (true) {
		if (check[r][c] == false) { // 현재 위치 청소	
			check[r][c] = true;
			answer++;
		}
		bool ch = false;
		for (int i = 0; i < 4; i++) {
			d = (d + 3) % 4; // 왼쪽방향으로 돌면서 봄
			int nr = r + idr[d];
			int nc = c + idc[d];
			if (board[nr][nc] == 0 && check[nr][nc] == false) {
				r += idr[d];
				c += idc[d];
				ch = true;
				break;// 왼쪽 방향에 청소하지 않은 공간이 있다면 한 칸 움직이고 1번으로 감
			}
		}
		if (ch == false) { // 4방향 모두 이동 못한 경우
			int back = (d + 2) % 4; // 바라보는 방향을 유지하기 위해서
			if (board[r + idr[back]][c + idc[back]] == 1) break;// 로봇 이동 종료 조건
			r += idr[back];
			c += idc[back];
		}
	}
	cout << answer << '\n';
}
728x90

댓글