본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 2174번 : 로봇 시뮬레이션

반응형

www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순

www.acmicpc.net

구현 문제였습니다.

기존 열,행 형식이 아닌 진짜 x,y좌표평면으로 생각해야 하므로 인덱스 처리가 약간 까다로웠습니다.

풀이방법

 1. 입력받고 기존에 많이 했던 행,열의 방식으로 바꾸어 정보를 저장합니다. 

 

 2. 그 후 명령마다 반복횟수만큼 방향을 고려해 안전한지 확인하고 로봇을 이동합니다. 벽에 충돌 또는 로봇과 충돌할 경우에는 정답을 갱신해줍니다. 정답(ans 변수)값이 이미 있으면 굳이 명령을 시행하거나 출력할 필요없다는 점 주의합니다.

 

 3. 만약 ans의 값이 ""가 아니라면 충돌이 일어났다는 뜻이므로 ans를 출력합니다. 그 외에는 "OK"를 출력합니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
int board[101][101];
//북, 동, 남, 서
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};

int b,a,n,m;
struct Robot{ int x,y,dir; };
vector <Robot> robot;
string ans;

void moveRobot(int robotNum, int iter, char op){
    if(ans!="") return;

    for(int i = 0; i < iter; i++){
        int DIR = robot[robotNum].dir;
        int X = robot[robotNum].x;
        int Y = robot[robotNum].y;
        if(op == 'L'){
            robot[robotNum].dir = (4 + DIR - 1 ) % 4;
        }
        else if(op == 'R'){
            robot[robotNum].dir = (DIR + 1) % 4;
        }
        else if(op == 'F'){
            int nx = X + dx[DIR];
            int ny = Y + dy[DIR];
            if(1 > nx || nx > b || 1 > ny || ny > a){
                ans = "Robot " + to_string(robotNum+1) + " crashes into the wall";
                break;
            }
            if(board[nx][ny]){
                ans = "Robot " + to_string(robotNum+1) + " crashes into robot " + to_string(board[nx][ny]);
                break;
            }
            board[X][Y] = 0;
            robot[robotNum].x = nx;
            robot[robotNum].y = ny;
            board[nx][ny] = robotNum + 1;
        }
    }
}

int main(){
    cin >> a >> b >> n >> m;
    for(int i = 0; i < n; i++){
        int x,y,dir;
        char d;
        cin >> x >> y >> d;
        if(d == 'N') dir = 0;
        else if(d == 'E') dir = 1;
        else if(d == 'S') dir = 2;
        else if(d == 'W') dir = 3;
        robot.push_back({b-y+1,x,dir});
        board[b-y+1][x] = i + 1;
    }

    while(m--){
        int robotNum, iter;
        char op;
        cin >> robotNum;
        cin >> op;
        cin >> iter;
        moveRobot(robotNum-1, iter, op);
    }

    if(ans == "") cout << "OK";
    else cout << ans;
}