코딩테스트/C++

[백준 BOJ] 2166번 - 다각형의 면적 (C++)

최-코드 2024. 1. 21. 21:50

2166번: 다각형의 면적 (acmicpc.net)

 

2166번: 다각형의 면적

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

www.acmicpc.net

중, 고등학생 때 많이 쓰던 신발끈 공식을 사용하면 쉽게 풀 수 있는 문제이다. 근데 여기서 놓치기 쉬운게 overflow가 있다. 좌표값의 절댓값은 100,000을 넘지 않은 정수이므로 x좌표와 y좌표끼리 최댓값으로 곱했을 때 overflow가 발생한다. 따라서 long long 형태로 좌표값을 저장해야 한다. 또한 소수점 첫째짜리 까지만 출력해야하므로 iostream보단 cstdio를 이용해 %.1f을 이용해주면 된다.

#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
	int N;
	vector<pair<long long,long long>> v;
	scanf("%d",&N);
	long long tmp1,tmp2;
	for(int i = 0; i<N; i++){
		scanf("%ld %ld",&tmp1, &tmp2);
		v.emplace_back(tmp1,tmp2);
	}
	double answer=0;
	for(int i = 0; i<v.size()-1; i++)
		answer+=v[i].first*v[i+1].second;
	answer+=v[N-1].first*v[0].second;
	for(int i = 0; i<v.size()-1; i++)
		answer-=v[i+1].first*v[i].second;
	answer-=v[0].first*v[N-1].second;
	answer=abs(answer);
	answer/=2;
	printf("%.1lf",round(answer*10)/10);
	return 0;
}