https://www.acmicpc.net/problem/2166
문제
N개의 점으로 이루어진 다각형의 넓이 구하기
N개의 x y 좌표가 주어진다.
풀이
어떻게 풀까 고민을 하다 CCW, 신발끈 정리라는 공식을 이용해서 푼 글들을 보았다.
다각형은 한 점을 기준으로 3개의 점으로 이루어진 삼각형들로 나눌 수 있다. 이들을 모두 더하면 된다.
혹시 음수가 나오면 그 부분은 방향이 반대이므로 음수가 나온 것이기 때문에 그냥 더해주면 된다.
마지막 최종 값에만 절댓값을 씌워주기만 하면 된다.
c++에서 소수점 몇째자리에서 반올림은 원래 round(x * 100)/100 이런 식으로 구현했었다.
그러나 이렇게 하면 100으로 딱 떨어질 때는 100.0이 아닌 100으로 출력된다.
소수점을 고정시키기 위해선 다음과 같이 하면 된다.
cout << fixed;
cout.precision(1);
cout << ans << "\n";
참고
https://pinacle.tistory.com/131
https://nextcoder.tistory.com/22
전체 코드
/*boj g5 2166 다각형의 면적*/
#include <cmath>
#include <iostream>
#define MAXN 10005
#define X first
#define Y second
using namespace std;
int N;
pair<long double, long double> arr[MAXN];
long double getArea(pair<long double, long double> A, pair<long double, long double> B, pair<long double, long double> C) {
long double a = A.X * B.Y + B.X * C.Y + C.X * A.Y;
long double b = B.X * A.Y + C.X * B.Y + A.X * C.Y;
return (a - b) / 2;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i].X >> arr[i].Y;
}
long double ans = 0;
for (int i = 1; i < N - 1; i++) {
ans += getArea(arr[0], arr[i], arr[i + 1]);
}
cout << fixed;
cout.precision(1);
cout << abs(ans) << "\n";
}
'알고리즘' 카테고리의 다른 글
백준 g4 2239 스도쿠 c++ (0) | 2024.03.22 |
---|---|
백준 g4 4803 트리 c++ (0) | 2024.03.21 |
백준 g4 1043 거짓말 c++ (0) | 2024.03.19 |
백준 g4 2617 구슬 찾기 c++ (0) | 2024.03.19 |
백준 g4 1707 이분 그래프 c++ (0) | 2024.03.18 |