로봇청소기_14503

ddo_h·2020년 5월 21일
0
post-thumbnail

문제 출처 : 로봇청소기_14503

파라미터 정리

NxM 전체 맵 크기 r : row, c : col (3~50)
청소기 방향 d : 0 북쪽 1 동쪽 2 남쪽 3 서쪽
맵 정보 : 0 빈칸 1 벽
벽을 통과할 수 없음, 한번 청소한 곳은 또 청소하지 않음

간략한 과정

input_1 N,M 입력받기
input_2 청소기의 정보 (r,c) d 입력받기
input_3 초기 맵의 정보 Map[N][M] 입력받기
청소기 동작 조건에 맞춰서 시뮬레이션 진행하기
로봇 청소기가 청소한 구역의 개수(res) 구하기
output res 출력하기

코드

#include <iostream>

using namespace std;

struct loc{
    int r,c,d;  
};
int N,M;
int Map[50][50];
loc robot;
int Dr[4] = {-1,0,1,0};
int Dc[4] = {0,1,0,-1};

int solve(){
    int res = 0;
    bool visited[50][50] = {false};
    int nr = robot.r, nc = robot.c, dir = robot.d;
    int cnt = 0;
            //현재 위치 청소
        visited[nr][nc] = true;
    do{
        if(cnt ==4){
            cnt = 0;
            nr -= Dr[dir];
            nc -= Dc[dir];
            if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1) break;
            if(Map[nr][nc] == 1) break;
            continue;
        }
        //왼쪽 방향에 청소x공간 존재
        dir = (dir+3)%4;
        nr += Dr[dir];
        nc += Dc[dir];
        cnt++;
        //왼쪽 방향에 청소x공간 존재x
        if(Map[nr][nc] == 1 || visited[nr][nc]){
            nr -= Dr[dir];
            nc -= Dc[dir];
            continue;
        }
        if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1){
            nr -= Dr[dir];
            nc -= Dc[dir];
            continue;
        }
        //왼쪽 방향에 청소x공간 존재
        visited[nr][nc] = true;
        cnt = 0;
    }while(1);
    
    
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            if(Map[i][j] != 1 && visited[i][j] == true) res++;
    
    return res;
}

int main()
{
    cin >> N >> M;
    int a,b,c;
    cin >> a >> b >> c;
    robot = {a,b,c};
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            cin >> Map[i][j];
    cout << solve() << endl;

    return 0;
}

다른 풀이

버전_2_0605

#include <iostream>

using namespace std;

struct loc{
  int r,c,d;  
};
int N,M;
loc rot;
int Map[50][50];
int Dr[4] = {-1,0,1,0};
int Dc[4] = {0,1,0,-1};

int solve(){
    int res,cnt = 0;
    int nr = rot.r, nc = rot.c, nd = rot.d;
    Map[nr][nc] = 9;
    res++;
    while(1){
        if(cnt==4){
            cnt = 0;
            nr -= Dr[nd];
            nc -= Dc[nd];
            if(Map[nr][nc]==1) break;
            continue;
        }
        nd = (nd+3)%4;
        nr += Dr[nd];
        nc += Dc[nd];
        cnt++;
        if(Map[nr][nc]==1||Map[nr][nc]==9||nc<0||nr<0||nc>M-1||nr>N-1){
            nr -= Dr[nd];
            nc -= Dc[nd];
            if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1) break;
            if(Map[nr][nc]==1) break;
            continue;
        }
        
        Map[nr][nc] = 9;
        res++;
        cnt = 0;
    }
    return res;
}

int main()
{
    cin >> N >> M;
    cin >> rot.r >> rot.c >> rot.d;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            cin >> Map[i][j];
    cout << solve() <<endl;
    
    return 0;
}

시행착오

문제 후기

문제 난이도는 쉬운데 막상 코드로 구현해보면 동작이 복잡하다고 생각이 듦
방향을 바꾸는 거나 전진, 그대로, 후진하는 상황이 헷갈렸음
또 가장자리가 벽으로 둘러쌓여 있어 범위 체크할 필요가 없다고 생각했는데, 동작하다보면 범위를 넘어갈 수 가 있었음 이런 경우 무한 루프에 빠져서 runtime error가 발생했음

profile
열심히!

0개의 댓글