알고리즘

[백준 java] 2166 다각형의 면적

Lahezy 2022. 10. 25.
728x90

백준 boj 2166 다각형의 면적 골드 5

🔗 문제링크 🔗

 

2166번: 다각형의 면적

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

www.acmicpc.net


🌟 생각 흐름 🌟

문제를 읽고 다각형의 면적을 구하는 방법이 있을 것 같아 구글링을 했다

아래 페이지를 참조하여 구현하였다.

 

다각형 넓이 구하기: 15 단계 (이미지 포함) - wikiHow

다각형의 넓이를 계산하는 일은 정삼각형 넓이를 구하는 것처럼 간단하기도 하지만 각 변의 길이가 다른 11각형의 넓이를 구하는 것처럼 복잡하기도 합니다. 다양한 다각형의 넓이를 구하는 방

ko.wikihow.com

위에 페이지에서 참조한 부분을 코드로 구현 시에 주의할 점은 범위만 주의하면 된다

input:
첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

이므로 100_000 * 100_000 = 10_000_000_000 이므로 int의 범위를 초과하기 때문에  곱셈을 수행하는 경우 double형으로 변경하여 계산하였다 ( 계산 시에 계산하는 자료형을 따라서 계산하기 때문에 오버플로우가 발생한다 )


🍳 코드 🍳

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int edge = Integer.parseInt(br.readLine());
        int arr[][] = new int[edge][2];
        
        /*input*/
        for (int i = 0; i < edge; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
        
        /*cal*/
        double sum = 0;

        for (int i = 0; i < edge; i++) {
            sum += (double) arr[i][0] * arr[(i + 1) % edge][1]; 
            sum -= (double)arr[i][1] * arr[(i + 1) % edge][0];
        }

	/*print*/
        System.out.printf("%.1f", Math.abs(sum / 2));
    }
}
728x90

댓글