반응형
구현 문제였습니다.
기존 열,행 형식이 아닌 진짜 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;
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 2828번 : 사과 담기 게임 (0) | 2021.04.25 |
---|---|
(C++) - 백준(BOJ) 2526번 : 싸이클 (0) | 2021.04.24 |
(C++) - 백준(BOJ) 14499번 : 주사위 굴리기 (0) | 2021.04.23 |
(C++) - 백준(BOJ) 20056번 : 마법사 상어와 파이어볼 (0) | 2021.04.20 |
(C++) - 백준(BOJ) 1913번 : 달팽이 (0) | 2021.04.18 |