본문 바로가기
알고리즘

백준 g5 2166 다각형의 면적 c++

by kyj0032 2024. 3. 20.

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

 

2166번: 다각형의 면적

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

www.acmicpc.net

 

문제

N개의 점으로 이루어진 다각형의 넓이 구하기

N개의 x y 좌표가 주어진다.

 

풀이

어떻게 풀까 고민을 하다 CCW, 신발끈 정리라는 공식을 이용해서 푼 글들을 보았다.

다각형은 한 점을 기준으로 3개의 점으로 이루어진 삼각형들로 나눌 수 있다. 이들을 모두 더하면 된다.

 

혹시 음수가 나오면 그 부분은 방향이 반대이므로 음수가 나온 것이기 때문에 그냥 더해주면 된다.

마지막 최종 값에만 절댓값을 씌워주기만 하면 된다.

 

 

c++에서 소수점 몇째자리에서 반올림은 원래 round(x * 100)/100 이런 식으로 구현했었다.

그러나 이렇게 하면 100으로 딱 떨어질 때는 100.0이 아닌 100으로 출력된다.

 

소수점을 고정시키기 위해선 다음과 같이 하면 된다.

cout << fixed;
cout.precision(1);
cout << ans << "\n";

 

참고

https://ip99202.github.io/posts/%EB%B0%B1%EC%A4%80-2166-%EB%8B%A4%EA%B0%81%ED%98%95%EC%9D%98-%EB%A9%B4%EC%A0%81/

 

백준 2166 다각형의 면적 c++

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

ip99202.github.io

https://pinacle.tistory.com/131

 

백준 2166 다각형의 면적 (c++) : 피너클

https://www.acmicpc.net/problem/2166 2166번: 다각형의 면적 첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는

pinacle.tistory.com

https://nextcoder.tistory.com/22

 

C++) 원하는 자리수 까지 출력하기 (반올림, 올림, 내림)

https://www.acmicpc.net/problem/2865 2865번: 나는 위대한 슈퍼스타K 첫째 줄에 N, M, K가 주어진다. (1 ≤ M ≤ 100, 1 ≤ K ≤ N ≤ 100) 다음 M개의 줄은 각 장르에 대한 참가자의 능력이 주어진다. 이 줄에는 N개

nextcoder.tistory.com

 

 

전체 코드

/*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