728x90
https://www.acmicpc.net/problem/14503
조건
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하기
현재 방향을 기준으로 왼쪽 방향부터 차례대로 인접 칸 탐색
청소하지 않은 칸 발견까지 왼쪽 회전
청소하지 않은 칸 발견하면 해당 방향으로 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
'🥇Baekjoon Solutions > 삼성SW 기출' 카테고리의 다른 글
[C++] 백준 14891번: 톱니바퀴 (0) | 2022.04.28 |
---|---|
[C++] 백준 16236번: 아기 상어 (0) | 2022.04.26 |
[C++] 백준 12100번: 2048 (Easy)(삼성SW기출) (0) | 2021.09.22 |
[C++] 백준 13460번: 구슬 탈출2(삼성SW기출) (0) | 2021.09.19 |
[C++] 백준 19237번: 어른 상어(삼성SW기출) (0) | 2021.09.18 |
댓글