백준 8911 거북이

Posted by : at

Category : Solution


Problem 문제풀이

 

구현중에 쉬운 편에 속하는 문제였다. 모든 점을 포함하는 직사각형 중 가장 작은 직사각형의 넓이를 구하는 문제로

모든 점 중에 가장 Left, Right, Top, Bottom에 위치한 점들을 변으로 하는 직사각형을 만들면 끝이다.

그러나 현재 위치가 가장 Left, Right, Top, Bottom인지 매번 체크하려면 main문이 너무 길어지기 때문에 이 부분만 따로 함수로 분리하겠다.

먼저 main문이다.

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> T;
	for (int tc = 0; tc < T; tc++)
	{
		curPos = { 0,0 };
		dir = 0;
		leftPos = curPos.second;
		rightPos = curPos.second;
		topPos = curPos.first;
		bottomPos = curPos.first;
		cin >> op;
		for (int i = 0; i < op.length(); i++)
		{
			if (op[i] == 'F')
			{
				curPos.first += dirR[dir];
				curPos.second += dirC[dir];
			}
			else if (op[i] == 'B')
			{
				curPos.first += dirR[(dir+2)%4];
				curPos.second += dirC[(dir+2)%4];
			}
			else if (op[i] == 'L')
			{
				dir = (dir + 3) % 4;
			}
			else if (op[i] == 'R')
			{
				dir = (dir + 1) % 4;
			}
			check();
		}
		cout << (topPos - bottomPos) * (rightPos - leftPos)<<'\n';
	}

	return 0;
}

여기서 방향은 0:북쪽, 1:서쪽, 2:동쪽, 3:남쪽이다.

int dirR[4] = { -1,0,1,0 };
int dirC[4] = { 0,1,0,-1 };

마지막으로 check함수를 보겠다.

void check()
{
	if (curPos.first > topPos)
	{
		topPos = curPos.first;
	}
	if (curPos.first < bottomPos)
	{
		bottomPos = curPos.first;
	}
	if (curPos.second > rightPos)
	{
		rightPos = curPos.second;
	}
	if (curPos.second < leftPos)
	{
		leftPos = curPos.second;
	}
}

매우 간단한 문제였으나 ‘\n’을 빼먹어서 틀렸다. ㅡ.ㅡ 여러분은 그런 실수를 안 하리라 믿는다!


End


About GJ

안녕하세요 방문해주셔서 감사합니다. 혹시 보시면서 궁금하신것 있으시면 https://open.kakao.com/o/sivaz71c로 연락주세용~

Star
Useful Links