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;
}