선택은 나의 것

[BOJ 백준] 2174번 로봇 시뮬레이션 본문

☽ Algorithm/BOJ

[BOJ 백준] 2174번 로봇 시뮬레이션

Algoribi 2021. 12. 14. 13:19

문제

BOJ number : https://www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

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

www.acmicpc.net

접근

 시뮬레이션 문제이기 때문에 문제에서 주어지는 조건만 잘 유념해서 구현하면 무리 없이 해결 가능한 문제이다. 다만 문제에서 주어지는 세로축의 좌표가 위에서부터 아래의 순서로 번호를 매기는 일반적인 방식이 아닌 그림과 같이 아래에서부터 위로 번호를 매기는 방식이어서 입력을 받을 때 B(땅의 세로 크기) + 1 - x(입력값) 해주었다.

 

코드

#include <iostream>
#include <map>

using namespace std;

struct robot {
    int x, y, d;
};

int A, B, N, M, dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}, land[105][105];
robot m[105];

int go(int rb, int num) {
    int going = m[rb].d, rx = m[rb].x, ry = m[rb].y;
    for (int i = 0; i < num; i++) {
        land[rx][ry] = 0;
        rx += dx[going];
        ry += dy[going];
        if (rx <= 0 || ry <= 0 || rx > B || ry > A)
            return -1;
        else if (land[rx][ry] != 0)
            return land[rx][ry];
    }
    m[rb].x = rx;
    m[rb].y = ry;
    land[rx][ry] = rb;
    return 0;
}

int turn(int rb, int num, char dd) {
    num = num % 4;
    if (dd == 'R')
        m[rb].d = (m[rb].d + num) % 4;
    else {
        m[rb].d -= num;
        if (m[rb].d < 0)
            m[rb].d += 4;
    } 
    return 0;
}

int main() {
    int x, y, t;
    char c;
    cin >> A >> B >> N >> M;
    for (int i = 1; i <= N; i++) {
       cin >> y >> x >> c;
       land[B + 1 - x][y] = i;
       if (c == 'N')
           t = 0;
       else if (c == 'E')
           t = 1;
       else if (c == 'S')
           t = 2;
       else
           t = 3;
       m[i] = {B + 1 - x, y, t};
    }
    for (int i = 0; i < M; i++) {
        cin >> x >> c >> y;
        if (c == 'F')
            t = go(x, y);
        else
            t = turn(x, y, c);
        if (t == -1){
            cout << "Robot "<< x <<" crashes into the wall";
            return 0;
        } else if (t > 0) {
            cout << "Robot "<< x <<" crashes into robot " << t;
            return 0;
        }
    }

    cout << "OK";
    return 0;
}

 

깃 허브 주소 : https://github.com/algoribi/algorithm-study

Comments