레야몬
[C++] 2166번 다각형의 면적 - 기하학, 다각형의 넓이 본문
#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
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 2252번 줄 세우기 - 위상 정렬 (0) | 2022.09.22 |
---|---|
[C++] 2239번 스도쿠 - 구현, 백트래킹 (0) | 2022.09.22 |
[C++] 2098번 외판원 순회 - DP, 비트마스킹, 외판원 순회 (0) | 2022.09.21 |
[C++] 1806번 부분합 - 두 포인터 (0) | 2022.09.21 |
[C++] 1208번 부분수열의 합 2 - 중간에서 만나기 (0) | 2022.09.21 |