[백준] 2166번 - 다각형의 면적 (Gold 5)
업데이트:
문제 링크
문제 설명
2차원 평면상의 점들이 다각형을 이루는 순서대로 주어져 있다.
다각형의 면적을 소수점 아래 둘째자리에서 반올림하여 첫째 자리까지 출력한다.
정답 코드 및 설명
첫 점을 원점으로 평행이동시켜도 다각형의 면적은 변하지 않는다.
점들이 다각형을 이루는 순서대로 주어져 있으므로, $\bigtriangleup P_{0}P_{1}P_{2}, \bigtriangleup P_{0}P_{2}P_{3}, \cdots$와 같이 다각형을 삼각형으로 쪼갤 수 있다.
이 때 오목 다각형의 경우를 고려하기 위해서는 삼각형의 면적을 부호 있는 값으로 생각하여야 하고, 외적을 이용하면 쉽게 계산할 수 있다.
실수 연산을 최소화하기 위해 외적값의 절반을 더하지 않고, 외적값을 직접 더한 후 최종 답에 절반을 취했다.
또한, 최종적으로 구해진 면적에는 부호가 없어야하므로 절댓값을 취했다.
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
import java.io.*;
import java.util.StringTokenizer;
public class BOJ2166 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] zeroPoint = new int[] { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) };
long[][] point = new long[n - 1][2];
for (int i = 0; i < n - 1; i++) {
st = new StringTokenizer(br.readLine());
point[i][0] = Integer.parseInt(st.nextToken()) - zeroPoint[0];
point[i][1] = Integer.parseInt(st.nextToken()) - zeroPoint[1];
}
double area = 0;
for (int i = 1; i < n - 1; i++) {
area += point[i - 1][0] * point[i][1] - point[i - 1][1] * point[i][0];
}
area = Math.abs(area) / 2;
bw.write(String.format("%.1f", area));
bw.close();
}
}
댓글남기기