알고리즘/시뮬레이션 & 구현

[백준/구현/C++] 14503번 로봇 청소기 (삼성 SW 역량 테스트 기출)

데메즈 2023. 1. 13. 12:27
728x90
반응형

https://www.acmicpc.net/workbook/view/1152

문제집: 삼성 SW 역량 테스트 기출 문제 (baekjoon)

www.acmicpc.net

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

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

문제 해결 방법

1. 동서남북 방향으로 움직을 dx, dy 배열 만들기
2. 청소했을 때 map[x][y]=2 를 해주고, 벽인 경우와 청소한 경우 체크하는 함수 만들기
3. 조건을 나누어 코드짜기
3-1. 4면 회전하고 후진 가능한 경우 : 후진하고 turn=0
3-2. 4면 회전하고 후진 불가능한 경우 : 결과 출력하고 종료
3-3. 청소할 수 있는 경우 : 이동 > 회전 > 청소 > 결과++ > turn=0
3-4. 벽이거나 청소된 경우 : 회전, turn++

#include <iostream>

using namespace std;
int n, m, r, c, d;
int map[51][51];
int dx[] = {-1, 0, 1, 0}; // 위, 오른쪽, 아래, 왼쪽
int dy[] = {0, 1, 0, -1};

bool isWall(int x, int y){
    if(map[x][y]==1) return false;

    return true;
}

bool isClean(int x, int y){
    if(map[x][y]==2) return false; // 이미 청소한 경우

    return true;
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> r >> c >> d;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> map[i][j];
        }
    }

    int turn = 0;
    int result = 1;
    map[r][c] = 2;
    while(1){

        int dd;
        if(d==0) dd = 3; // 왼쪽으로 회전
        else dd = d - 1;

        bool wall = isWall(r+dx[dd], c+dy[dd]); // 벽:false, 빈칸:true
        bool clean = isClean(r+dx[dd], c+dy[dd]); // 청소O:false, 청소X:true

        if(turn == 4 && isWall(r-dx[d], c-dy[d])){ // 4면 회전 & 후진 가능
            r = r-dx[d]; // 후진
            c = c-dy[d];
            turn = 0;
        } else if(turn == 4 && !isWall(r-dx[d], c-dy[d])){ // 4면 회전 & 후진 불가능
            cout << result;
            return 0;
        } else if(wall && clean){ // 청소할 수 있는 경우
            r = r+dx[dd]; // 이동
            c = c+dy[dd];
            d = dd; // 회전
            map[r][c] = 2; // 청소
            result++;
            turn = 0;
        } else if(!wall || !clean){ //벽이거나 청소된 경우
            d = dd; // 회전
            turn++;
        }
    }
}
728x90
반응형