카테고리:

Problem Link: https://www.acmicpc.net/problem/2166

문제 설명

Site: Baekjoon
Number: 2166
Category: Geometry
Rank: Gold 5

다각형의 점들을 순서대로 주어졌을 때, 그 다각형의 넓이를 구하는 문제입니다.

문제 풀이

참조: https://www.mathopenref.com/coordpolygonarea2.html

위의 사이트에서 다각형의 넓이를 구하는 공식을 활용하여 해결하였습니다.

다각형의 넓이를 구하는 방법은 한 변과 y축이 이루는 사각형의 넓이를 더하여 다각형의 넓이만을 남깁니다.

사이트에서 제공하는 방법은 점들을 시계방향으로 회전해야 하며, x좌표가 양수인 경우에만 정상적으로 작동하기에 주어진 좌표를 계산할 때 추가 계산을 해주어야 합니다.

주어진 문제에서 x좌표가 음수가 나올 수 있으므로 x좌표에 100000을 더해주고, 주어진 순서가 반시계방향일 수 있으므로 마지막에 절댓값을 취해주면 올바른 정답을 도출해낼 수 있습니다.

#include <iostream>
#include <iomanip>

using namespace std;

double CoordX[10002];
double CoordY[10002];

double adj = 100000;

double Area(int idx)
{
    double x1 = adj + CoordX[idx];
    double y1 = CoordY[idx];
    double x2 = adj + CoordX[idx+1];
    double y2 = CoordY[idx+1];

    return ((x1 + x2) * (y1 - y2) / 2);
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int N;
    cin >> N;

    for(int i = 0; i < N; i++)
    {
        cin >> CoordX[i] >> CoordY[i];
    }
    CoordX[N] = CoordX[0];
    CoordY[N] = CoordY[0];

    double area = 0.0f;

    for(int i = 0; i < N; i++)
    {
        area += Area(i);
    }

    cout << fixed;
    cout << setprecision(1) << abs(area);

    return 0;
}