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’을 빼먹어서 틀렸다. ㅡ.ㅡ 여러분은 그런 실수를 안 하리라 믿는다!