백준/2166번/다각형의 면적/골드5
카테고리: CodingTest
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;
}