알고리즘 풀이/Java

[Java][X] 다각형의 면적

Dong's Universe 2025. 1. 22. 09:44

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

import java.io.*;
import java.util.*;

class Main {

	static int N;
	static int[][] polygon;
	static double[] center;
	static double area;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		polygon = new int[N+1][2];
		center = new double[2];
		area = 0;

		StringTokenizer st;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			polygon[i][0] = Integer.parseInt(st.nextToken());
			polygon[i][1] = Integer.parseInt(st.nextToken());
		}

		polygon[N][0] = polygon[0][0];
		polygon[N][1] = polygon[0][1];

		for (int i = 0; i < N; i++) {
			area += findArea(polygon[i][0], polygon[i][1], polygon[i + 1][0], polygon[i + 1][1]);
		}
		
        System.out.printf("%.1f%n", Math.abs(area));
	}

	public static double findArea(double x1, double y1, double x2, double y2) {
		return (x1 * y2 - x2 * y1) / 2;
	}
}

나의 풀이

- 처음에는 중심점을 구하고 나서 꼭짓점 두개씩을 이으면 삼각형으로 이루어지게 되는데 그러면 삼각형의 면적을 다 더하면 된다고 생각했다.

- 하지만 간과했었던 것은 이건 볼록 다각형인 경우에만 가능한 이야기이고 오목 다각형인 경우에는 중심점과 특정 꼭짓점을 잇게 되면 그 다각형의 내부에서 벗어나 외부로 가는 경우가 있을 수 있고 그렇게 되면 삼각형 면적의 합으로 표현이 안되는 것이다.

- 근데 다각형의 면적을 구하는 공식(외심 이용)이 따로 있기에 그걸 사용했다. 원리에 대해서는 더 공부해보겠다.

- 그러나 계속 틀렸다고 나오는데 결과적으로 double에 대해서 잘 몰랐기 때문이었다.

- 처음에는 반올림의 방식이 잘못되었나 생각했다. (Math.round(area * 10) / 10.0)

- 근데 위는 잘못이 없었고 double은 기본적으로 지수표기법을 하기 때문에 표기법이 달라 틀리게 되었던 것이다.

- 아래 링크는 관련해서 정리해놓은 페이지이다.
https://ggjggj.tistory.com/946

 

[Java] double, float을 println으로 찍게 되면

값이 작으면 그대로 출력이 되지만값이 커지면 지수표기법이 사용된다.예를 들어, 다음과 같다.39999999999.5 => 3.99999999995E10이를 지수표기법을 사용하지 않고 찍고 싶다면 다음의 경우들로 가능하

ggjggj.tistory.com