새소식

코딩테스트/백준_골드

[C++][백준 2166] 다각형의 면적

  • -

[문제]

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

 

2166번: 다각형의 면적

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

www.acmicpc.net


[문제 풀이]

신발끈 공식을 알면 비교적 쉽게 풀 수가 있던 문제였다.

다각형의 넓이를 구하는 방법은 삼각형을 만든 뒤에 해당 삼각형의 넓이를 모두 더하면 해당 넓이가 된다는 것을 우리들은 배웠다.

사각형의 경우는 삼각형 2개를 합쳐서 만들어진것이고 오각형의 경우에는 삼각형 3개가 합쳐진 경우이다.

즉, 해당 다각형을 구하기 위해서는 꼭지점 1개를 모두 공유하는 삼각형들의 모든 넓이를 더하면 된다.

 

하지만, 단순히 x와 y좌표만을 주고 삼각형 넓이를 모두 구하자니 계산이 너무 어려워진다.

그러니, 신발끈 공식을 이용해서 풀어보자.

https://ko.wikipedia.org/wiki/%EC%8B%A0%EB%B0%9C%EB%81%88_%EA%B3%B5%EC%8B%9D

 

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

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

ko.wikipedia.org

해당 공식을 이용하면 삼각형의 넓이는 

로 계산이 된다.

이제 해당 공식을 이용해서 풀어보도록 하자.


[코드]

#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>

using namespace std;

double solve(vector<double> x, vector<double> y, int n){
    double answer = 0.0;
    for(int i = 2;i<n;i++){
        answer += x[0] * y[i-1] + x[i-1] * y[i] + x[i] * y[0];
        answer -= x[i-1] * y[0] + x[i] * y[i-1] + x[0] * y[i];
    }
    return answer;
}

int main(){
    int n;
    cin>>n;
    vector<double> x(n,0);
    vector<double> y(n,0);
    for(int i = 0;i<n;i++){
        cin>>x[i];
        cin>>y[i];
    }
    double answer = solve(x,y,n) / 2;
    cout<<fixed;
    cout.precision(1);
    cout<<abs(answer)<<endl;
    return 0;
}

'코딩테스트 > 백준_골드' 카테고리의 다른 글

[C++][백준 2617] 구슬 찾기  (0) 2022.11.02
[C++][백준 1956] 운동  (0) 2022.10.29
[C++][백준 2458] 키 순서  (0) 2022.10.28
[C++][백준 11403] 경로 찾기  (0) 2022.10.28
[C++][백준 11404] 플로이드  (0) 2022.10.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.