알고리즘 풀이/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