본문 바로가기

백준/C++

[Baekjoon/C++] 2166번 - 다각형의 면적

[백준] Baekjoon Online Judge

문제로 이동

 

문제

2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으로 이루어진 다각형이 있다. 이 다각형의 면적을 구하는 프로그램을 작성하시오.

 

입력

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

 

출력

첫째 줄에 면적을 출력한다. 면적을 출력할 때에는 소수점 아래 둘째 자리에서 반올림하여 첫째 자리까지 출력한다.

 

풀이

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int N;
vector<pair<long long, long long>> dot;

long long sum();
long long sub();

long long sum() {
    long long n = 0;
    for (int i = 0; i < N; i++) {
        if (i == N - 1)
            n += (dot[i].first * dot[0].second);
        else
            n += (dot[i].first * dot[i + 1].second);
    }

    return n;
}

long long sub() {
    long long n = 0;
    for (int i = 0; i < N; i++) {
        if (i == 0)
            n += (dot[i].first * dot[N - 1].second);
        else
            n += (dot[i].first * dot[i - 1].second);
    }

    return n;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;
    for (int i = 0; i < N; i++) {
        int x, y;
        cin >> x >> y;

        dot.push_back({ x, y });
    }

    long long result = abs(sum() - sub());

    cout << fixed;
    cout.precision(1);
    cout << result / 2.0 << '\n';

    return 0;
}

 

 신발끈 공식을 코드로 구현하여 문제를 풀었다.

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 신발끈 공식(―公式)은 좌표평면 상에서 꼭짓점의 좌표를 알 때 다각형의 면적을 구할 수 있는 방법이다. 다각형의 각 꼭짓점의 좌푯값을 교차하여 곱하는 모

ko.wikipedia.org

 

신발끈 공식 정의

long long sum() {
    long long n = 0;
    for (int i = 0; i < N; i++) {
        if (i == N - 1)
            n += (dot[i].first * dot[0].second);
        else
            n += (dot[i].first * dot[i + 1].second);
    }

    return n;
}

 위의 공식에서 더하는 부분의 총합을 구하는 함수이다.

 

long long sub() {
    long long n = 0;
    for (int i = 0; i < N; i++) {
        if (i == 0)
            n += (dot[i].first * dot[N - 1].second);
        else
            n += (dot[i].first * dot[i - 1].second);
    }

    return n;
}

 위의 공식에서 빼는 부분의 총합을 구하는 함수이다.

 

    long long result = abs(sum() - sub());

    cout << fixed;
    cout.precision(1);
    cout << result / 2.0 << '\n';

 위의 함수들로 구한 숫자를 서로 빼고, 그것의 절댓값을 2로 나누어 출력하는 부분이다. 소수점 아래 둘째 자리에서 반올림한 것을 출력하도록 했으며, 이를 위해 2가 아닌 2.0을 사용하여 계산하도록 했다.