카테고리 없음

[백준] 로봇 청소기 14503번 (c++) 구현

salmon16 2024. 9. 22. 12:16

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

풀이 방법

로봇 청소기의 작동 방법 설명에 따라 그대로 코드로 구현했다.

 

먼저 방향을 북, 동, 남, 서 순서로 0번 인텍스에서 3번 인덱스까지 정장한다.

90도 반시계 방향으로 회전하는 방법은 현재 방향의 인덱스에 +3을 한 후 4로 나누었을 때 나머지를 통해 구하고

후진하는 방법은 현재 방향의 인덱스에 +2를 한 후 나머지 4 연산을 통해 구현했다.

그 후 각 방향에서 앞칸이 방안인지 벽인지, 청소 가능 구역인지를 판단한 후 설명 방법에 따라 구현을 했다.

청소를 완료한 칸은 2로 설정했다.

 

#include <iostream>
#include <vector>

using namespace std;

int dy[4] = {-1, 0, 1, 0}; // 북, 동, 남, 서
int dx[4] = {0, 1, 0, -1};

int N, M;
int y, x, d;
vector<vector<int> > room;
int cnt;

bool isRoom(int yy, int xx) { //방 안인지 판별하는 함수
    if (yy >= 0 && yy < N && xx >= 0 && xx < M) {
        return true;
    }
    else return false;
}

void move(int yy, int xx, int dir) {
    if (room[yy][xx] == 0) { //현재 칸이 청소가 되지 않은 경우
        cnt++;
        room[yy][xx] = 2; // 2를 청소 완료 칸이라 가정
    }
    bool flag = false; // 청소 되지 않은 빈칸의 존재 여부
    for (int i = 0;i < 4;i++) {        
        int ny = yy + dy[i];
        int nx = xx + dx[i];
        if (isRoom(ny, nx)) { // 방 안이다.
            if (room[ny][nx] == 0) { // 청소 안된 빈칸 존재.
                flag = true;
            }
        }
    }

    if (flag) { // 청소 안된 빈칸이 존재하는 경우
        dir = (dir + 3) % 4; // 90도 반시계 회전
        int ny = yy + dy[dir], nx = xx + dx[dir];
        if (room[ny][nx] == 0) { // 앞 칸이 청소 안되어 있으면 이동
            move(ny, nx, dir);
        }
        else { // 바라보는 방향의 앞칸이 청소가 되지 않은 빈칸이 아님 다른 방향을 찾으러 1번부터 
            move(yy, xx, dir);
        }
    }
    else { // 청소되지 않은 빈칸이 없는 경우
        // int back = (dir + 2) % 4; // 후진
        int back = (dir + 2) % 4;
        int ny = yy + dy[back], nx = xx + dx[back];
        if (isRoom(ny, nx)) {
            if (room[ny][nx] != 1) { //벽이 아니면 이동
                move(ny,nx, dir);
            }
            else { // 이동 불가인 경우 종료
                return;
            }
        }
        else return; // 방 밖의 인덱스인 경우 종료
        
    }


}
int main() {
    cin >> N >> M; // 방 크기 입력
    cin >> y >> x >> d; // 시작 청소기 위치
    room.resize(N);
    for (int i = 0;i < N;i++) { // 방 구조물 입력
        for (int k = 0;k < M;k++) { 
            int a;
            cin >> a;
            room[i].push_back(a);
        }
    }

    move(y, x, d);
    cout << cnt;

    return 0;
}