백준/골드

[백준 2166번] 다각형의 면적 (C++)

게임개발기원 2023. 8. 25. 18:07

문제링크 : https://www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

vector<pii>v;
double ccw(double x1, double x2, double x3, double y1, double y2, double y3) //삼각형 넓이 구하기
{
    double temp = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1);
    return temp/2;
}

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

    for(int i=0; i<N; i++)
    {
        int x, y;
        cin >> x >> y;
        v.push_back({x, y});
    }

    double result = 0;
    for(int i=2; i<N; i++)
    {
        result += ccw(v[0].first, v[i-1].first, v[i].first, v[0].second, v[i-1].second, v[i].second);
    }

    cout.precision(1); //소수점 첫째자리까지 출력
    cout << fixed << abs(result);
    return 0;
}

다각형을 삼각형으로 나누고, 해당 삼각형의 넓이를 더하는 것으로 풀 수 있는 문제이다.

세 점이 주어졌을 때 해당 세점으로 이루어진 삼각형의 넓이를 구하는 공식인 사선 공식을 이용했다.

이는 ccw알고리즘의 값에 /2를 반환해주면 된다.

<사선 공식>
((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1)) /2

 

고정점(v[0])을 설정하고 고정점을 기준으로 한 쪽방향으로 꼭짓점을 돌면서 사선 공식을 통해 삼각형의 넓이를 구해주는 동시에 모든 꼭짓점을 돌때까지 넓이를 더해가면서 반복해주면 된다.

 

이때 음수가 존재할 수 있으므로 결과값에 절대값을 씌워서 출력해준다.