티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

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

www.acmicpc.net

 

풀이

어떤 삼각형의 세 좌표가 주어졌을 때, 그 삼각형의 넓이는 외적값의 절반입니다.

CCW를 구하는데도 외적이 쓰이구요. CCW에 대해선 다음 글을 참고해주세요.

CCW로 세 점의 방향성 판별하기 - 데구리 블로그

 

이걸 확장해서 다각형의 면접을 구할 때도 CCW를 사용할 수 있습니다.

한 점을 기준으로 잡고, 연속한 두 점마다 CCW의 값을 더해준 뒤, 합의 절댓값을 2로 나눠주면 됩니다.

놀랍게도 이 방법은 오목 다각형에도 예외 없이 적용됩니다.

 

 

정답 코드

#include <bits/stdc++.h>
#define ft first
#define sd second
using namespace std;
using ll = long long;

int n;
pair<ll, ll> p[10000];
ll ccw(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3) {
	return x1*y2 + x2 * y3 + x3 * y1 - (y1*x2 + y2 * x3 + y3 * x1);
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> p[i].ft >> p[i].sd;
	}
    auto [x, y] = p[0];
	ll ans = 0;
	for (int i = 1; i < n - 1; i++) {
		ans += ccw(x, y, p[i].ft, p[i].sd, p[i + 1].ft, p[i + 1].sd);
	}
    ans = abs(ans);
    cout << ans/2;
    if(ans & 1) cout << ".5";
    else cout <<".0";
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 2252 줄 세우기  (0) 2021.03.08
[BOJ] 백준 2239 스도쿠  (0) 2021.03.08
[BOJ] 백준 2143 두 배열의 합  (0) 2021.03.08
[BOJ] 백준 1987 알파벳  (0) 2021.03.08
[BOJ] 백준 1806 부분합  (0) 2021.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/02   »
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
글 보관함