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 |