※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2174번 문제인 로봇 시뮬레이션이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2174
2174번: 로봇 시뮬레이션
첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순
www.acmicpc.net
문제 제목에 적혀있듯이 주어지는 로봇의 움직임을 시뮬레이션하는 것으로 문제를 해결할 수 있다.
모든 행동을 한단계씩 실행하더라도 최대 10,000번의 움직임만을 하게 되므로 명령에 주어지는 횟수만큼 직접 시뮬레이션을 돌려주자.
행과 열 순서의 입력이 아닌 X축과 Y축 순서의 입력이 들어오는 것에 주의하자.
방위와 관련한 구현은 해당 방위에 어떤 변화가 생기는지를 기록해두는 함수나 배열을 이용하여 간소화할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
char LEFT[128];
char RIGHT[128];
int arr[102][102];
pair<pair<int, int>, char> robot[101];
int dr[128];
int dc[128];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
LEFT['N'] = 'W';
LEFT['W'] = 'S';
LEFT['S'] = 'E';
LEFT['E'] = 'N';
RIGHT['N'] = 'E';
RIGHT['E'] = 'S';
RIGHT['S'] = 'W';
RIGHT['W'] = 'N';
dr['N'] = 1, dr['S'] = -1, dc['W'] = -1, dc['E'] = 1;
int R, C; cin >> C >> R;
int N, M; cin >> N >> M;
for (int i = 1; i <= N; i++) {
int r, c; char dir; cin >> c >> r >> dir;
robot[i] = make_pair(make_pair(r, c), dir);
arr[r][c] = i;
}
while (M--) {
int i, rep; char cmd; cin >> i >> cmd >> rep;
while (rep--) {
if (cmd == 'L') robot[i].second = LEFT[robot[i].second];
else if (cmd == 'R') robot[i].second = RIGHT[robot[i].second];
else {
int rr = robot[i].first.first + dr[robot[i].second], cc = robot[i].first.second + dc[robot[i].second];
if (rr<1 || rr>R || cc<1 || cc>C) {
cout << "Robot " << i << " crashes into the wall";
return 0;
}
if (arr[rr][cc]) {
cout << "Robot " << i << " crashes into robot " << arr[rr][cc];
return 0;
}
arr[robot[i].first.first][robot[i].first.second] = 0;
arr[rr][cc] = i;
robot[i].first = make_pair(rr, cc);
}
}
}
cout << "OK";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1719 // C++] 택배 (0) | 2022.05.20 |
---|---|
[BOJ 12022 // C++] 짝 (0) | 2022.05.19 |
[BOJ 14014 // C++] Dudu of English (0) | 2022.05.17 |
[BOJ 14010 // C++] Where To Go? (0) | 2022.05.16 |
[BOJ 25193 // C++] 곰곰이의 식단 관리 (0) | 2022.05.15 |