반응형
알고리즘 종류
- 구현
사고 과정
- 좌표와 방향 수정
1. 본인은 왼쪽 상단을 (1,1)으로 사용하려고 한다. 그러면 좌표를 수정하고 4방향도 수정한다. 위쪽이 S이고 아래는 N이 된다. EW는 그대로이다.
- 동작
1. for문으로 저장된 명령을 하나씩 수행한다.
2. 로봇의 ID를 가져와서 명령을 수행하고 조건 1.벽에 부딪혔는지, 조건 2. 로봇에 부딪혔는지 확인한다.
구현(C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct Robot{
int y, x;
int d;
};
int r, c, n, m;
int mat[101][101];
int dir[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}}; // N E S W
vector<Robot> robots;
vector<pair<pair<int, int>, int> > cmd; // id, cmd, cnt
bool isValid(int y, int x){
return (y>=1 && y<=r) && (x>=1 && x<=c);
}
void solution(){
for(int i=0; i<cmd.size(); i++){
// 명량 정보 가져오기
int id = cmd[i].first.first;
int cm = cmd[i].first.second;
int cnt = cmd[i].second;
if(cm != 2) cnt %= 4;
// 로봇 정보 가져오기
int y = robots[id].y;
int x = robots[id].x;
int d = robots[id].d;
mat[y][x] = 0;
// 움직이기
if(cm == 0){
for(int j=0; j<cnt; j++){
if(d==0) d=3;
else if(d==3) d=2;
else if(d==2) d=1;
else if(d==1) d=0;
}
robots[id].d = d;
}
else if(cm == 1){
for(int j=0; j<cnt; j++){
if(d==0) d=1;
else if(d==1) d=2;
else if(d==2) d=3;
else if(d==3) d=0;
}
robots[id].d = d;
}
else if(cm == 2){
for(int j=0; j<cnt; j++){
y += dir[d][0];
x += dir[d][1];
if(mat[y][x]){
printf("Robot %d crashes into robot %d", id, mat[y][x]);
return;
}
if(!isValid(y, x)){
printf("Robot %d crashes into the wall", id);
return;
}
}
robots[id].y = y;
robots[id].x = x;
}
mat[y][x] = id;
}
printf("OK");
}
int main(void){
memset(mat, 0, sizeof(mat));
cin >> c >> r >> n >> m;
robots.resize(n+1);
// 로봇 정보 받기
int y, x, d;
char di;
int id=1;
for(int i=0; i<n; i++){
cin >> x >> y >> di;
mat[y][x] = id;
if(di=='S') d=2;
else if(di=='E') d=1;
else if(di=='N') d=0;
else if(di=='W') d=3;
Robot ro;
ro.y = y;
ro.x = x;
ro.d = d;
robots[id] = ro;
id++;
}
// 명령 정보 받기
int cnt;
char c;
int cm;
for(int i=0; i<m; i++){
cin >> id >> c >> cnt;
if(c=='L') cm=0;
else if(c=='R') cm=1;
else if(c=='F') cm=2;
cmd.push_back({{id, cm}, cnt});
}
solution();
}
|
cs |
시행착오
- 문제에서 제시된 좌표가 본인이 주로 사용하는 형태가 아니어서 다소 귀찮은 신경쓰임이 필요했다.
1. 입력되는 값이 가로, 세로 값이 들어온다. 보통 세로와 가로 순으로 들어오는데 여기서는 반대였다. 눈치챘어야 했다.
2. (1,1)을 좌측상단에 사용하면 L에서 회전이 왼쪽 90도가 아니라 오른쪽 90가 된다. 마찬가지로, R로 왼쪽 90도 회전이 아니라 오른쪽 90도 회전이 된다.
3. (1,1)을 좌측상단에 사용하면, 왼쪽이 W, 아래가 N, 오른쪽이 E, 위쪽이 S이 된다.
4. mat에는 로봇의 ID를 저장하여 위치를 나타내고, Robots에 로봇에 대한 정보를 저장한다.
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 2263 트리의 순회 (0) | 2021.02.24 |
---|---|
[백준][C++] 1967 트리의 지름 (0) | 2021.02.24 |
[백준]][C++] 1022 소용돌이 예쁘게 출력하기 (0) | 2021.02.23 |
[백준][C++] 2470 두 용액 (0) | 2021.02.20 |
[백준][C++] 1613 역사 (0) | 2021.02.19 |