BOJ C++ 알고리즘 공부

[기하학] 다각형의 넓이(2166) C++

kk_eezz 2022. 2. 10. 00:38

 

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

 

2166번: 다각형의 면적

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

www.acmicpc.net

 

 

1. 문제 개요

 

2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으로 이루어진 다각형이 주어질 때, 이 다각형의 면적을 구하는 문제.

 

 

 

 

2. 입출력

 

 

3. 문제 풀이

 

다각형을 이루는 순서대로 점이 주어지므로 신발끈 공식을 사용해서 해결할 수 있다.

 

 

4. 전체 코드

#include <algorithm>
#include <stdio.h>
#include <vector>
#include <cmath>

using namespace std;
//다각형의 넓이

int main(){
    
    vector<pair<long long ,long long >> v;
    int n;
    long long x,y;
    
    scanf("%d",&n); //점의 개수
    
    for(int i=0;i<n;i++){
        scanf("%lld%lld",&x,&y);
        v.push_back({x,y});
    }
    
    double sum=0;
    
    for(int i=0;i<n-1;i++){
        sum += (v[i].first*v[i+1].second)-(v[i].second*v[i+1].first);
    } //신발끈 공식
    
    sum += (v[n-1].first*v[0].second)-(v[n-1].second*v[0].first);
    //첫점과 마지막점
    
    printf("%.1f\n", floor(std::abs(sum)*0.5*10+0.5)/10);
    //절댓값 sum의 값을 반올림한 값.
    
    return 0;
}