baekjoon 2166:다각형의 면적
2166번 다각형의 면적
접근
매번 절댓값해서 더해야하는 줄 알았는데 그러면 오목다각형을 계산하지 못한다고 한다. 신발끈 공식을 이용하는 것처럼 그냥 음수도 처음엔 절댓값 붙이지 않고 더해줘야
오목다각형의 경우 서로 상쇄되는 효과가 나서 정확한 넓이를 구할 수 있다.
마지막에 절댓값해주면 된다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//2166
#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
long long int sizeCal(pair<long long int, long long int> a, pair<long long int, long long int> b, pair<long long int, long long int> c){
pair<long long int, long long int> v1 = {b.first - a.first, b.second - a.second};
pair<long long int, long long int> v2 = {c.first - a.first, c.second - a.second};
// cout << v1.first * v2.second - v1.second * v2.first << "\n";
return v1.first * v2.second - v1.second * v2.first;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
vector<pair<long long int, long long int>> v(n);
for(int i = 0; i < n; i++){
long long int a, b;
cin >> a >> b;
v[i] = {a, b};
}
// for(auto i : v){
// cout << i.first << ' ' << i.second << '\n';
// }
long long int ans = 0;
for(int i = 0; i <= n-3; i++){
ans += sizeCal(v[0], v[i+1], v[i+2]);
}
double anss = (double)ans/2;
cout << fixed << setprecision(1) << abs(anss);
return 0;
}
배운 점
union-find에 대해 응용도 해보았고, union-find가 분리 집합을 만드는 알고리즘 중 하나라는 것을 알게 되었다.
union-find의 구현도 여러가지 방법이 있다는 것을 알게 되었다.
This post is licensed under CC BY 4.0 by the author.