본문 바로가기

백준

백준2166 - 다각형의 면적

https://www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

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

www.acmicpc.net

자릿수 때문에 많은 고민이 있던 문제다. 꼭 cout으로 자릿수 표현을 하고 싶어서 검색을 하였더니 ios::fixed를 이용하면 고정 소숫점을 출력할 수 있다는 사실을 알게 되었다. 그리고 정수 입력이 들어 오더라도 외적의 결과 값은 실수 형태이니 혹시 모를 오류에 대비하여 입력을 처음부터 실수로 받았다.

 

#include <iostream>
#include <utility>
#include <cmath>
using namespace std;
int main() {
	pair<double, double> p[10002]; //좌표를 입력받을 공간, 정답이 실수형이므로 정수 입력이 들어와도 실수 취급을 하기 위해 double을 사용, 최대 10000개이고 1번 인덱스부터 사용
	int n; //좌표의 갯수
	long double sum_a = 0, sum_b = 0; //외적의 과정을 구현하기 위해 사용할 변수
	long double res = 0; //외적 결과

	//n개의 좌표를 입력, first는 x좌표, second는 y좌표
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int a, b;
		cin >> a >> b;
		p[i].first = a;
		p[i].second = b;
	}

	//마지막 외적의 좌표 대상으로 첫번째 x좌표, y좌표가 들어가야한다.
	p[n + 1].first = p[1].first;
	p[n + 1].second = p[1].second;

	//외적 구현, 한 칸 더 크게 잡아서 다음과 같은 코드가 성립
	for (int i = 1; i <= n; i++) {
		sum_a = sum_a + p[i].first * p[i + 1].second;
		sum_b = sum_b + p[i].second * p[i + 1].first;
	}

	res = abs(sum_a - sum_b) / 2; //외적 결과

	//소숫점 한 자리까지 출력하기 위해 사용한 코드, 고정 소수점을 사용하고 1자리까지 출력한다는 의미
	cout.setf(ios::fixed);
	cout.precision(1);
	cout << res;
}

'백준' 카테고리의 다른 글

백준2553 - 마지막 팩토리얼 수  (0) 2019.08.25
백준15654 - N과 M (5)  (0) 2019.08.24
백준2003 - 수들의 합2  (0) 2019.08.22
백준1759 - 암호 만들기  (0) 2019.08.21
백준2644 - 촌수계산  (0) 2019.08.20