-
[백준] 14503 로봇청소기알고리즘/알고리즘 풀이 2020. 2. 26. 23:13
문제 설명
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
입력
- 첫째 줄에 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 50)
- 둘째 줄에 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 주어진다. d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다.
- 셋째 줄부터 N개의 줄에 장소의 상태가 북쪽부터 남쪽 순서대로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 빈 칸은 0, 벽은 1로 주어진다. 장소의 모든 외곽은 벽이다.
- 로봇 청소기가 있는 칸의 상태는 항상 빈 칸이다.
입력 예
3 3 1 1 0 1 1 1 1 0 1 1 1 1
출력
- 로봇 청소기가 청소하는 칸의 개수를 출력한다.
출력 예
1
풀이
#include <iostream> #define MAX 50 using namespace std; int N, M; int X, Y, D; int map[MAX][MAX] = {0, }; int visit[MAX][MAX] = {0, }; int result = 0; // 북 동 남 서 int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; bool inRange(int nx, int ny) { return (nx >= 0 || ny >= 0 || nx < N || ny < M); } void cleaning(int x, int y, int d, int count) { int nx, ny, nd; while(1) { // 4번 다 회전한 경우 if (count == 4) { nd = (d + 2) % 4; // 후진 1칸 x += dx[nd]; y += dy[nd]; if (!inRange(x, y) || map[x][y] == 1) return; count = 0; // 후진했으니 count 초기화 continue; } // d기준 반시계 방향 이동 d = (d + 3) % 4; nx = x + dx[d]; ny = y + dy[d]; // 청소할 수 있는 경우 if (inRange(nx, ny) && map[nx][ny] == 0 && visit[nx][ny] == 0) { visit[nx][ny] = 1; // 현재 위치를 청소 result++; x = nx; y = ny; count = 0; } else { count++; } } } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cin >> N >> M; cin >> X >> Y >> D; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> map[i][j]; } } if (map[X][Y] == 0) { visit[X][Y] = 1; result++; } cleaning(X, Y, D, 0); cout << result; return 0; }
리뷰
- 난이도가 낮은 시뮬레이션 문제이다.
- 2시간 소요.....(분하다)
- 동/서/남/북을 x, y좌표계로 계산하는 게 헷갈려 다 풀어놓고도 계속 틀리다고 나와 시간이 많이 소요됐다.
- 여기서도 단순한 반시계방향으로의 회전을 시키면 되기 때문에 2020/02/17 - [알고리즘] - [백준] 3190 뱀 이때의 풀이와 같이
모듈러를 이용해 계산하였다.
해당 문제 링크
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음
www.acmicpc.net
'알고리즘 > 알고리즘 풀이' 카테고리의 다른 글
[백준] 14888 연산자 끼어넣기 (0) 2020.02.29 [백준] 14501 퇴사 (0) 2020.02.24 [백준] 14500 테트로미노 (0) 2020.02.24 댓글