체뚱로그

[백준/C++] 14503 - 로봇 청소기 본문

PS/BOJ

[백준/C++] 14503 - 로봇 청소기

sooyeoniya 2024. 3. 19. 13:34

풀이 시간: 57m36s00

시간 복잡도: O(NM)

공간 복잡도: O(NM)

문제

입력

출력

문제 풀이

본 문제는 단순 시뮬레이션 구현 문제이다.

문제 자체에 조건들이 아주 친절하게 설명이 되어있기 때문에 해당 조건들을 하나씩 따라가면서 풀다보면 쉽게 구현할 수 있는 문제이다.

 

전체 코드는 다음과 같다. 자세한 설명은 주석으로 대체한다.

전체 코드

#include <iostream>
using namespace std;
int N, M, r, c, d, cnt = 0;
int arr[51][51] = { 0, };
int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 
// dir[i][j] : 북 동 남 서, i번째 줄, j번째 칸

void cleanRoom(int r, int c) {
	if (arr[r][c] == 0) { cnt++; arr[r][c] = 2; } // 현재 칸 (r, c) 청소
	bool isEmpty = false;
	for (int i = 0; i < 4; ++i) // 주변 4칸 검사
		if (arr[r + dir[i][0]][c + dir[i][1]] == 0) 
			isEmpty = true;
	if (!isEmpty) { // 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
		// 바라보는 방향의 뒤쪽 칸으로 후진 가능한 경우
		if (arr[r + dir[(d + 2) % 4][0]][c + dir[(d + 2) % 4][1]] != 1)
			cleanRoom(r + dir[(d + 2) % 4][0], c + dir[(d + 2) % 4][1]);
		else return; // 뒤쪽 칸이 벽이라 후진이 불가능한 경우 작동 멈춤
	}
	else { // 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우
		// 반시계 90도 회전 및 앞쪽 칸이 청소되지 않은 빈칸인 경우 전진
		while(1) { // 음수인 경우 양수로 조정
			d = (d - 1) % 4 < 0 ? (d - 1) % 4 + 4 : (d - 1) % 4;
			if (arr[r + dir[d][0]][c + dir[d][1]] == 0) break;
		}
		cleanRoom(r + dir[d][0], c + dir[d][1]);
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> N >> M >> r >> c >> d;
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < M; ++j)
			cin >> arr[i][j];
	cleanRoom(r, c);
	cout << cnt;
	return 0;
}

 

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

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

'PS > BOJ' 카테고리의 다른 글

[백준/C++] 9370 - 미확인 도착지  (2) 2024.03.27
[백준/C++] 10816 - 숫자 카드2  (0) 2024.03.25
[백준/C++] 16236 - 아기 상어  (0) 2024.03.19
[백준/C++] 14500 - 테트로미노  (0) 2024.03.19
[백준/C++] 13460 - 구슬 탈출 2  (0) 2024.03.13
Comments