Algorithm/백준

[백준][C++] 2166번: 다각형의 면적 <209>

샤아이인 2022. 4. 4.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

 

2166번: 다각형의 면적

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

www.acmicpc.net

생각의 흐름

이번 문제는 사실 보자마자 풀이는 떠올랐다.

그냥 점 3개씩 잡아서 외적 하면 넓이 나오는 문제이다.

 

우선 외적으로 면적을 구하는 공식은 다음과 같다.

3점을 기준으로 외적을 진행해 주면 삼각형의 면적이 나온다.

이를 좌표마다 진행해주면 된다. 다음 블로그의 글을 먼저 참고하길 권장한다.

 

다각형 도형의 면적(넓이) 구하기

프로그래밍 등을 할 때 알아두면 유용한 다각형의 면적 구하는 방법입니다. (오랜만에 수학관련 포스팅을 합니다 ^^) 1. 2차원 평면에서 세 점의 좌표를 알 때 삼각형 면적 구하기 세 점의 좌표를

darkpgmr.tistory.com

 

나의 코드

#include <bits/stdc++.h>
using namespace std;
#define MAX 1001

int N;
vector<pair<int, int>> vec;

double external(double x1, double x2, double x3, double y1, double y2, double y3){
    double temp = (x1*y2 + x2*y3 + x3*y1) - (x2*y1 + x3*y2 + x1*y3);
    return temp/2;
}

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

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

    double res = 0;
    for(int i = 1; i < N; i++) {
        res += external(vec[0].first, vec[i-1].first, vec[i].first, vec[0].second, vec[i-1].second, vec[i].second);
    }

    cout.precision(1);
    cout << fixed;
    cout << abs(res);

    return 0;
}

댓글