Gidhub BE Developer

[BOJ] 14503. 로봇 청소기

2018-10-17
goodGid

Problem

Problem URL : 로봇 청소기


[1] Answer Code (18. 10. 17)

#include<iostream>
#include<vector>
#define p pair<int,int>
using namespace std;

/*
 문제에서 4방향 값은
 [0 1 2 3]
 [북 동 남 서]로 주어진다.
 
 현재 북쪽(= 0)을 보고 있다면
 다음에 체크해야하는 방향은 서쪽(= 3)이다.
 */
int indexDir[4] = {3,0,1,2};

/*
 0 : 북쪽을 보고 있을 때 체크해야하는 좌표 값은
 현재 좌표가 (i,j)라면 (i,j-1)이다.
 1,2,3 방향에 대해서도 마찬가지이다.
 */
p changeDir[4] = {
    p(0,-1),
    p(-1,0),
    p(0,1),
    p(1,0)
};

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

int map[50][50];
int v[50][50];

int n,m;

bool inRange(int x, int y){
    if(x<0 || x>=n || y<0 || y>=m)
        return false;
    return true;
}

// 북 동 남 서 순서
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    
    int x,y,dir;
    cin >> x >> y >> dir;
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> map[i][j];
        }
    }
    
    int nx;
    int ny;
    while (1) {
        /*
         현재 값이 1이라면
         더 이상 진행이 불가능한 상황이다.
         */
        if( map[x][y] == 1)
            break;
        
        v[x][y] = 1;
        int flag = 0;
        for(int i=0; i<4; i++){
            nx = x + changeDir[dir].first;
            ny = y + changeDir[dir].second;
            if( inRange(nx,ny) && map[nx][ny] == 0 && v[nx][ny] == 0){
                dir = indexDir[dir];
                x = nx;
                y = ny;
                flag = 1;
                break;
            }
            dir = indexDir[dir];
        }
        
        /*
         4방향 탐색이 불가능할 경우
         방향은 유지한채 왔던 좌표로 움직인다.
         
         changeDir[ indexDir[dir] ]
         이 코드가 이해안된다면
         직접 한 번 해보면 이해가 될꺼다.
         */
        if( flag == 0 ){
            x = x + changeDir[ indexDir[dir] ].first;
            y = y + changeDir[ indexDir[dir] ].second;
        }
        
    }
    
    int cnt = 0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if( v[i][j] == 1 )
                cnt ++;;
        }
    }
    
    cout << cnt << endl;

    return 0;
}

Review

  • 삼성 역량 테스트 기출 문제

  • 처음에 문제 규칙이 이해가 되지 않아 시간이 걸렸다.

  • 방향과 관련된 로직은 다른 코드를 보니까 내가 어렵게 구현한거 같다.

  • 다음에 풀 땐 간결하게 풀어보도록 하자 !


Comments

Content