문제풀이/알고리즘 문제 풀이

[ 백준 14503 ] 로봇 청소기 (C++) - 구현

RealTone 2024. 3. 6. 17:41
728x90

🔗 문제 링크

 

14503번: 로봇 청소기

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

www.acmicpc.net


💡 문제 풀이 및 해석

  1. 문제의 전체적인 흐름은 '현재 칸 청소'
  2. 반시계 90도로 회전하면서 청소할 있을 경우 이동
  3. 한 바퀴 돌고도 청소할 공간이 없다면 후진한다.
  4. 후진할 공간이 없다면 작동을 멈춘다.

⭐️ 정답 코드 및 설명

#include<iostream>

using namespace std;

int N, M, r, c, d;
int dir[] = { 0,3,2,1 };
int next_x[] = { 0,1,0,-1 };
int next_y[] = { -1,0,1,0 };

struct Map
{
    bool isClean = false;
    int Wall;
};

Map MAP[50][50];

void input() {
    cin >> N >> M;
    cin >> r >> c >> d;
    for (int y = 0; y < N; y++) {
        for (int x = 0; x < M; x++) {
            cin >> MAP[y][x].Wall;
            if (MAP[y][x].Wall == 1) MAP[y][x].isClean = true;
        }
    }
}

void sol() {

    int sy = r, sx = c;
    int answer = 0;

    while (1) {

        if (!MAP[sy][sx].isClean) {
            MAP[sy][sx].isClean = true;
            answer++;
        }

        bool go = false;

        for (int i = 0; i < 4; i++) { // 반 시계방향
            d = (d + 3) % 4; // 반시계 방향으로 90도 회전
            int nx = sx + next_x[d], ny = sy + next_y[d];
            if (nx > -1 && ny > -1 && ny < N && nx < M) {
                if (!MAP[ny][nx].isClean) { // 벽이 아니고 청소도 안되있으면 이동
                    sy += next_y[d], sx += next_x[d];
                    go = true;
                    break;
                }
            }
        }

        if (!go) { // 이동하지 못했다면
            // 2-Case
            int nx = sx + next_x[(d+2)%4], ny = sy + next_y[(d+2)%4];

            if (nx < 0 || nx >= M || ny < 0 || ny >= N || MAP[ny][nx].Wall == 1) {
                cout << answer;
                break;
            }
            else {
                sy = ny;
                sx = nx;
            }
        }
    }
}

int main() {

    input();
    sol();

    return 0;
}

😅 문제 후기

문제를 푸는데, 전체적으로는 푸는데 어려운점은 없었지만, '북동남서' 와 '북서남동' 두가지 방법 있는데, 반시계 방향이니 '북서남동'으로 움직이는 방법으로 선택했다.
이 때,

int next_x[] = { 0,1,0,-1 };
int next_y[] = { -1,0,1,0 };
대신에, 
int next_x[] = { 0,-1,0,1 };
int next_y[] = { -1,0,1,0 };

을 선택하여 (d+1) % 4 형식으로 문제를 풀었는데, 이렇게하면 틀린다고 한다. 그래서 이 부분만 위쪽의 코드로 (d+3) % 4 로 하면 해결되는데, 우선순위의 문제 때문에, 이런 방식으로 문제를 풀어야 한다고 질문게시판에 있었지만, 아직 잘 이해가 되지 않는다. 둘다 탐색하는 방식은 북->서->남->동으로 동일하다고 생각하고, 예제도 제대로 풀리는데 조금 더 공부해서 리뷰를 남겨놓겠다.

728x90