업데이트:

문제 링크

백준 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();
    }
}

댓글남기기