본문 바로가기

Programming/BOJ Solutions

[백준 2166번] 다각형의 면적

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB329675148522.611%

문제

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

입력

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

출력

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

예제 입력 1 

4
0 0
0 10
10 10
10 0

예제 출력 1 

100.0


CCW 알고리즘 분류에 있는데 CCW는 별로 필요없고,


벡터 외적에 대한 개념이 있어야 풀 수 있는 문제이다. (두 벡터의 외적은 평행사변형의 크기)


다루는 변수의 숫자 범위가 매우 크기 때문에 모두 long long과 double을 사용해야한다.


처음에 계속 틀려서 빡쳤었는데 절대값 위치가 잘못됐었다. 절대값은 마지막에만 한! 번! 넣어줘야한다.


점 2개를 이용해서 푸는 방법과 첫째점을 기준점으로 점 3개를 이용해서 푸는 방법 2가지


모두 주석으로 넣어두었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<math.h>
#include<algorithm>
 
using namespace std;
 
int N;
double size;
pair<long long,long long> ary[10001];
 
double get_size(int a, int b){
    return (double)(ary[a].first*ary[b].second-ary[a].second*ary[b].first);
}
 
double get_size(int a, int b, int c){
    return (double)(ary[a].first*ary[b].second-ary[b].first*ary[a].second + ary[b].first*ary[c].second - ary[c].first*ary[b].second + ary[c].first*ary[a].second - ary[a].first*ary[c].second);
}
 
int main() {
 
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> N;
 
    for(int i=0; i<N;i++){
        cin >> ary[i].first >> ary[i].second;
    }
 
    //for(int i=1;i<N-1;i++) {
    for(int i=0;i<N;i++){
        //size += get_size(0, i, i+1);
        size += get_size(i,(i+1)%N);
    }
 
    size = abs(size);
 
    printf("%.1lf"size/2);
 
    return 0;
}
cs


'Programming > BOJ Solutions' 카테고리의 다른 글

[백준 6497번] 전력난  (0) 2018.09.16
[백준 1774번] 우주신과의 교감  (0) 2018.09.06
[백준 11758번] CCW  (0) 2018.08.24
[백준 1912번] 연속합  (0) 2018.08.23
[백준 14728번] 벼락치기  (0) 2018.08.23