[백준/BOJ] 백준 8911번 : 거북이

2020. 9. 18. 02:33알고리즘 문제풀이

www.acmicpc.net/problem/8911

 

8911번: 거북이

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져

www.acmicpc.net

명령어에 따라 거북이를 움직이며 이동한 위치의 x, y값의 최댓값과 최솟값을 구해 직사각형의 넓이를 출력한다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int dydx[4][2] = { {0,-1},{-1,0},{0,1},{1,0} };
int x_min;
int x_max;
int y_min;
int y_max;


void Solve(string command)
{
	//(0,0)위치에서 위쪽을 바라보고 있을때
	//바라보는 방향과, 위치를 저장
	pair<int, pair<int, int>> here = make_pair(3, make_pair(0, 0));

	for (int i = 0; i < command.size(); i++)
	{
		pair<int, pair<int, int>> there = here;

		if (command[i] == 'F')
		{
			there.second.first += dydx[there.first][0];
			there.second.second += dydx[there.first][1];
		}

		else if (command[i] == 'B')
		{
			there.second.first -= dydx[there.first][0];
			there.second.second -= dydx[there.first][1];
		}

		else if (command[i] == 'L')
		{
			there.first--;

			if (there.first < 0)
				there.first = 3;
		}

		else if (command[i] == 'R')
		{
			there.first++;

			if (there.first > 3)
				there.first = 0;
		}

		x_min = min(x_min, there.second.second);
		x_max = max(x_max, there.second.second);
		y_min = min(y_min, there.second.first);
		y_max = max(y_max, there.second.first);

		here = there;
	}
}

int main()
{
	int tc;
	string command;

	cin >> tc;

	for (int t = 0; t < tc; t++)
	{
		x_min = 0;
		x_max = 0;
		y_min = 0;
		y_max = 0;

		cin >> command;

		Solve(command);

		//직사각형의 넓이를 출력한다
		cout << (x_max - x_min)*(y_max - y_min) << "\n";
	}

	return 0;
}