본문 바로가기
Algorithm/구현

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

by 루시킴 2021. 8. 30.

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

삼성 SW역량 기출문제로 오랜만에 다시 풀어보았다. 많이 나오는 구현 문제이다!

설명은 주석으로 대체 :) 

#include <iostream>
using namespace std;

int N, M;
int R, C, D;
int map[50][50];
int dx[4] = { -1,0,1,0 }; //0:북, 1:동, 2:남 , 3:서
int dy[4] = { 0,1,0,-1 };
int cnt = 0; //청소 공간

int main() {
	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];
		}
	}
	bool exit = false; //청소 끝 여부
	while (!exit) {
		cnt++; //청소
		map[R][C] = 2; //청소표시
		int check = 0; //네 방향 탐색
		while (check<4) {
			check++;
			D = (D == 0 ? 3 : D - 1); //왼쪽방향으로
			int cx = R + dx[D];
			int cy = C + dy[D];
			if (cx >= 0 && cx < N && cy >= 0 && cy < M) {
				if (map[cx][cy] == 0) {//청소하지 않은 공간이면
					R = cx; C = cy;
					break;
				}
			}
			if (check == 4) { //네 방향 탐색 후
				int cx = R - dx[D]; //후진
				int cy = C - dy[D];
				if (cx >= 0 && cx < N && cy >= 0 && cy < M && map[cx][cy] != 1) {//벽이 아니면
					R = cx;  C = cy;
					check = 0; //후진 후 재탐색
				}
				else { //벽이면
					exit = true; //종료
					break;
				}
			}
		}
	}
	cout << cnt << endl;
}

댓글