레야몬

[C++] 2166번 다각형의 면적 - 기하학, 다각형의 넓이 본문

알고리즘/백준

[C++] 2166번 다각형의 면적 - 기하학, 다각형의 넓이

Leyamon 2022. 9. 22. 00:10
#include <iostream>

#define LOOP(i, N) for(int i=0; i<N; i++)
#define MAX_DOT_CNT 10001

using namespace std;

int N;  //점의 개수 N
double loc[MAX_DOT_CNT][2];  //점의 좌표
double sum;  //넓이의 합

void input()
{
    cin >> N;
    LOOP(i, N) cin >> loc[i][0] >> loc[i][1];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    input();
    

    LOOP(i, N) {
        double x1=loc[i][0], y1=loc[i][1];
        double x2=loc[(i+1)%N][0], y2=loc[(i+1)%N][1];
        
        sum+=x1*y2-x2*y1;
    }
    
    cout << fixed; cout.precision(1);
    cout << 0.5*abs(sum);
    
    return 0;
}

다른 사람들의 코드랑 알고리즘이 똑같은 데 소요 시간이 늦게 걸리는 걸 보며 고민을 조금 했는데 매크로를 쓰면 4ms정도 늦어지는 것 같고 cin과 cout 보다 printf랑 scanf가 더 빠르고 사용하는 사람들도 많아서 cin, cout를 않쓰고 printf랑 scanf를 쓸까 싶기도 하다. 나중에 너무 심하다 싶으면 바꾸는 걸로

 

이 문제는 신발끈 정리로 간단하게 풀 수 있다. 맨처음에는 작은 삼각형 여러개로 할려고 했었는데 생각해보니 그냥 계속 이어보면 하나로 이어져서 ㅋㅋㅋ. 

 

<시행착오>

1. 이 문제에서 좌표를 계산할 때도 int형의 범위를 넘어갈 수 있으므로 lld또는 double형으로 좌표를 정의해야 한다.

2. cout로 출력을 하려면 별도의 설정이 필요한 듯 하다.

 

 

 

<신발끈 공식>

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

 

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

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

ko.wikipedia.org

 

<cout 소수점 개수 지정하기>

https://atomic0x90.github.io/c++/2020/02/10/c++-decimal-place.html 

 

<문제 반례 모음>

https://www.acmicpc.net/board/view/59807

 

글 읽기 - 반례 하나 추가

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 

 

 

※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.

Comments