2166. 다각형의 면적 풀이
난이도: Gold V
문제 주소: https://www.acmicpc.net/problem/2166
문제 풀이
이 문제는 2차원 평면상에 주어진 N개의 점으로 이루어진 다각형의 면적을 구하는 문제이다. 좌표값은 절댓값이 100,000을 넘지 않는 정수로 주어진다.
이 문제는 신발끈 공식을 사용하면 풀 수 있지만 공식을 모른다면 어려울거 같다

주의할 점은 좌표 범위가 굉장히 크기 때문에 범위가 작은 자료형을 사용하면 틀릴수도 있을거 같아서 이를 방지하기 위해 계산에 사용할 변수 xy와 yx를 long double 자료형으로 선언하여 소수점 연산의 정확도를 높였다
그리고 신발끈 공식을 코드에 적용할 때 마지막 점과 첫 번째 점이 다시 교차해서 곱해져야 하는데 이 부분을 처리하기 위해 배열의 범위를 하나 더 늘리고 마지막 n번째 인덱스에 첫 번째 좌표를 한 번 더 대입해 주는 방식으로 해결했다.
polygon[n][0] = polygon[0][0]; polygon[n][1] = polygon[0][1];
이렇게 배열에 미리 전처리를 해두면 반복문을 1부터 n까지 돌릴 때 인덱스 초과나 복잡한 조건문 없이 깔끔하게 교차 곱을 누적할 수 있게 된다.
for (int i = 1; i <= n; i++) { xy += polygon[i - 1][1] polygon[i][0]; yx += polygon[i - 1][0] polygon[i][1]; }
마지막으로 출력 조건에 맞추기 위해 fixed와 setprecision(1)을 사용하여 결괏값을 정확히 소수점 첫째 자리까지 반올림하여 출력하도록 만들었다.
최종 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <math.h>
#include <queue>
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
long double polygon[10001][2];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
long double xy = 0,yx = 0;
cin >> n;
for (int i = 0; i < n; i++) cin >> polygon[i][0] >> polygon[i][1];
polygon[n][0] = polygon[0][0]; polygon[n][1] = polygon[0][1];
for (int i = 1; i <= n; i++) {
xy += polygon[i - 1][1] * polygon[i][0];
yx += polygon[i - 1][0] * polygon[i][1];
}
cout << fixed << setprecision(1) << abs(xy - yx) / 2;
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
| [백준] 10814 - 나이순 정렬 (0) | 2026.04.01 |
|---|---|
| [백준] 10942 - 팰린드롬? (0) | 2026.03.23 |
| [백준] 12851 - 숨바꼭질2 (0) | 2026.03.19 |
| [백준] 12865 - 평범한 배낭 (0) | 2026.03.17 |
| [백준] 11053 - 가장 긴 증가하는 부분 수열 (0) | 2026.03.13 |