#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <string>
#include <tuple>
#include <cmath>

using namespace std;
typedef pair<long double, long double> pii;
int n, cnt = 0, a, b;
priority_queue<int, vector<int>, greater<int>> pq;
vector<pii> v;
int main()
{
    int n;
    long double a, b;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        scanf("%Lf %Lf", &a, &b);
        v.push_back({ a, b });
    }
    long double x1, y1, x2, y2, x3, y3;
    x1 = v[0].first;
    y1 = v[0].second;
    long double res = 0;
    for (int i = 1; i < v.size(); i++) {
        x2 = v[i - 1].first;
        y2 = v[i - 1].second;
        x3 = v[i].first;
        y3 = v[i].second;
        res += (x1 * y2 + x2 * y3 + x3 * y1) - (x2 * y1 + x3 * y2 + x1 * y3);
    }
    printf("%.1Lf", abs(res/2));
    return 0;
}

수학적 풀이가 필요한 문제이다...

일단 일반적으로 3개의 점이 주어진 삼각형을 구하는 공식은 오른쪽과 같다.

이 때 너비를 구할 때 절대값을 해주는 이유는 외적에서 방향성을 통해 양수 값의 너비를 구하기 위함이다. 보통 이런식으로 문제를 풀면 된다고 생각한다.

하지만 이 문제의 경우 주어진 점을 순서대로 이은 후에 마지막에 나타나는 다각형의 너비를 구하는 문제이므로 점을 이쁘게 모두 이은 다각형 모양이 아닌 순서가 약간 뒤바뀌어 이었을 때 나올 수 있는 여러개의 다각형의 너비를 구하는 식으로 풀어야 한다.

따라서 위의 공식에서 절대값을 뺀 값들을 계속 더하게 되면 어느 곳에서는 음수인 너비가 다른 곳에서 양수의 값으로 상쇄되는 식으로 계산되어 결국 마지막에 제대로 된 너비를 구할 수 있게 된다.... 이해가 잘 안된다면 너비 외적 구하기 검색 ㄱㄱ..

 

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

 

2166번: 다각형의 면적

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

www.acmicpc.net

 

'책장 > 알고리즘' 카테고리의 다른 글

[백준-2075] N번째 큰 수  (0) 2021.08.19
[백준-9935] 문자열폭발  (0) 2021.08.19
[백준-2239] 스도쿠  (0) 2021.08.18
[백준-2357] 최솟값과 최댓값  (0) 2021.08.16