알고리즘/문제 풀이

2166번: 다각형의 면접

Themion 2021. 12. 14. 16:28

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

 

2166번: 다각형의 면적

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

www.acmicpc.net

신발끈 공식을 이용하면 쉽게 해답을 구할 수 있다.

#include <cmath>
#include <cstdio>

using namespace std;

typedef long long ll;

#define MAX_N 10000

// 다각형을 이루는 각 점의 좌표
int point[MAX_N + 1][2];

int main() {
    // 다각형을 이루는 점의 수
    int N;
    // 다각형의 면적을 저장할 변tn
    long double ans = 0;

    // 다각형의 점의 수와 각 점의 좌표를 입력
    scanf("%d", &N);
    for (int i = 0; i < N; i++) scanf("%d %d", &(point[i][0]), &(point[i][1]));
    // 신발끈 공식을 위해 첫번째 좌표를 마지막에 추가
    point[N][0] = point[0][0]; point[N][1] = point[0][1];
    
    // 신발끈 공식을 이용해 면적을 계산
    for (int i = 1; i <= N; i++) {
        ans += (ll)point[i - 1][0] * (ll)point[i][1];
        ans -= (ll)point[i - 1][1] * (ll)point[i][0];
    }
    ans = (ans >= 0 ? ans : -ans) / 2;

    // 면적을 소수점 아래 둘째 자리에서 반올림하여 첫째 자리까지 출력
    printf("%.1Lf\n", round(ans * 10) / 10);

    return 0;
}