반응형
https://www.acmicpc.net/problem/8911
단순 구현 문제다. Turtle 이라는 클래스를 만들어서 풀었다. 정답으로 출력해야 하는 직사각형의 넓이는 거북이의 이동경로에서 가로/세로 최대/최소값의 차이를 곱하면 된다.
문제에서 주어진 네 개의 함수는 그대로 구현했고, 여기에 init() 라는 함수를 추가했다. 이 함수는 거북이가 이동할때마다 x, y의 최대 최소값을 초기화해주는 함수다.
문제가 어렵지 않으므로 바로 정답 코드...
#include <iostream>
#include <vector>
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
using namespace std;
class Turtle {
public:
int x, y, max_x, max_y, min_x, min_y, dir;
Turtle() : x(0), y(0), max_x(0), min_x(0), max_y(0), min_y(0), dir(UP) {}
void forward() {
if (dir == LEFT) --x;
else if (dir == RIGHT) ++x;
else if (dir == UP) ++y;
else if (dir == DOWN) --y;
}
void backward() {
if (dir == LEFT) ++x;
else if (dir == RIGHT) --x;
else if (dir == UP) --y;
else if (dir == DOWN) ++y;
}
void init() {
if (x > 0) max_x = max(max_x, x);
if (x < 0) min_x = min(min_x, x);
if (y > 0) max_y = max(max_y, y);
if (y < 0) min_y = min(min_y, y);
}
void turn_left() {
if (dir == LEFT) dir = DOWN;
else if (dir == RIGHT) dir = UP;
else if (dir == UP) dir = LEFT;
else if (dir == DOWN) dir = RIGHT;
}
void turn_right() {
if (dir == LEFT) dir = UP;
else if (dir == RIGHT) dir = DOWN;
else if (dir == UP) dir = RIGHT;
else if (dir == DOWN) dir = LEFT;
}
int get_ans() {
return (max_x - min_x) * (max_y - min_y);
}
};
int main() {
int n;
vector<string> v;
string str;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str;
v.push_back(str);
}
for (int i = 0; i < n; i++) {
str = v[i];
Turtle turtle = Turtle();
for (int j = 0; j < str.size(); j++) {
if (str[j] == 'F') {
turtle.forward();
turtle.init();
}
else if (str[j] == 'B') {
turtle.backward();
turtle.init();
}
else if (str[j] == 'R') turtle.turn_right();
else if (str[j] == 'L') turtle.turn_left();
}
cout << turtle.get_ans() << endl;
}
return 0;
}
반응형
'알고리즘 문제풀이 > 추천 문제' 카테고리의 다른 글
[ 백준 2933 ] 미네랄 (C++) (0) | 2022.03.22 |
---|---|
[ 백준 11559 ] Puyo Puyo (C++) (0) | 2022.03.21 |
[ 백준 16113 ] 시그널 (C++) (0) | 2022.03.08 |
[ 백준 2290 ] LCD Test (C++) (0) | 2022.02.28 |
[ 백준 16506 ] CPU (C++) (0) | 2022.02.23 |