본문 바로가기
코딩테스트/백준 (BOJ)

[BOJ 14503] 로봇 청소기 (C++)

by 모닥불꽃 2021. 4. 9.
반응형

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

로봇 청소기 문제

구현 방법

이 문제는 구현 문제였습니다.

 

문제에 주어진 로직대로 구현하면 되는 문제였습니다.

 

단 결정적인 아이디어를 떠올린 부분은 다음과 같습니다.

 

2번의 a번 조건과 b번 조건에서 현재 보고 있는 방향의 왼쪽 칸을 탐색합니다.

 

문제에 주어진 조건에 의하면 0 =  북쪽(상), 1 = 동쪽(우), 2 = 남쪽(하), 3 = 서쪽(좌) 입니다.

 

좌측을 구하는 방법은 ( 현재 바라보는 방향 + 3 ) % 4 입니다.

 

예를 들어 방향이 2이면, 아래를 향하고 있으므로 왼쪽인 오른쪽을 바라보려면 (2+3)%4 의 결괏값은 1로 오른쪽을 보게 됩니다.

 

문제를 아직 해결하지 못하신 분들은 여기까지 읽어보고 직접 구현해 보시기 바랍니다.

 

위 로직을 다음과 같이 구현했습니다.

 

소스 코드

#include <bits/stdc++.h>
using namespace std;

int arr[51][51];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

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

    int n, m;
    cin >> n >> m;
    int count = 0;
    int x, y;
    //0 = 북(상), 1 = 동(우), 2 = 남(하), 3 = 서(좌)
    int direction;
    cin >> x >> y >> direction;

    //장소 입력 받기
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            cin >> arr[i][j];
        }
    }

    while(1) {
        //1. 현재 위치 청소
        if(arr[x][y] == 0) {
            arr[x][y] = 2;
            count++;
        }

        //2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
        //a. 왼쪽 방향에서 아직 청소하지 않은 공간이 존재하면, 그 방향으로 회전한 다음 한칸을 전진하고 1번부터 진행한다.
        if(arr[x-dx[(direction+3)%4]][y+dy[(direction+3)%4]] == 0) {
            //그 방향으로 회전
            direction = (direction+3)%4;
            
            //한칸 전진
            x -= dx[direction];
            y += dy[direction];
            
        }//b. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유치한 채로 한 칸 후진하고 2번으로 돌아간다.
        else if(arr[x+1][y] &&arr[x][y+1] && arr[x-1][y]) && arr[x][y-1]) {
            
            //후진 할 수 있으면
            if(direction%2 == 0 && arr[x + dx[direction]][y] != 1) {
                x += dx[direction];
            } else if(direction%2 == 1 && arr[x][y - dy[direction]] != 1){
                y -= dy[direction];
            }
            
            //뒤쪽 방향이 벽이라 우진도 할 수 없는 경우에는 답 출력하고 작동을 멈춘다.
            else if(direction%2 == 0 && arr[x + dx[direction]][y] == 1) {
                cout << count;
                return 0;
            } else if(direction%2 == 1 && arr[x][y - dy[direction]] == 1) {
                cout << count;
                return 0;
            }
            
            
        }//b. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
        else if (arr[x-dx[(direction+3)%4]][y+dy[(direction+3)%4]] != 0){
            direction = (direction+3)%4;
        }
    }
}
반응형

'코딩테스트 > 백준 (BOJ)' 카테고리의 다른 글

[BOJ 2798] 블랙잭 (C++)  (0) 2021.04.29
[BOJ 2437] 저울 (C++)  (0) 2021.04.21
[BOJ 3190] 뱀 (C++)  (0) 2021.04.12
[BOJ 6198] 옥상 정원 꾸미기 (C++)  (0) 2021.04.09
[BOJ 4179] 불! (C++)  (0) 2021.02.28

댓글