차곡차곡 성 쌓기
article thumbnail

1. 문제

 

 

2. 접근

다각형은 삼각형으로 구성되니깐 한 점을 고정 시킨 다음 두 점을 이동시켜서 삼각형의 넓이를 구해주면 되겠구나 했다.

근데 계속해도 틀렸다고 나오길래 포기했다.

 

나는 처음 들어보는 신발끈 공식을 이용하는 풀이였다. 삼각형은 왜 안되나 봤더니 아래그림에서 점 P2, P3, P4으로 삼각형의 넓이 공식을 적용하면 제대로 된 넓이를 구할 수 없었다.

 

 

신발끈 공식은 시계 반대(정) 방향으로 돌면서 두 점을 정해 각 x, y를 곱해주어서 빼준다. 이때 마지막 점은 다시 첫 점으로 돌아와야 한다.

코드로 구현하면 다음과 같다.

for(int i=0; i<N; i++){
            Point p1 = points.get(i);
            Point p2 = points.get((i+1)%N);

            sum += p1.x*p2.y - p2.x*p1.y;
        }

        bw.write( String.format("%.1f", Math.abs(sum)/2.0));

 

이때 중요한 점은 sum에다가 값을 더할 때 절대값으로 붙이면 안되는 것이다. 다 더한 다음에 결과에 절대값을 붙여야한다. 부호가 다른 것도 다 적용해야지 제대로 된 값이 나온다. 그리고 마지막에 2로 나눠주면 다각형의 넓이가 나온다. 주의할 점은 결과가 Int 범위를 초과하니 long으로 선언해줘야 한다.

 

3. 전체 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

class Main {
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        int N = Integer.parseInt(br.readLine());

        List<Point> points = new ArrayList<>();

        for(int i=0; i<N; i++){
            String [] str = br.readLine().split(" ");
            int x = Integer.parseInt(str[0]);
            int y = Integer.parseInt(str[1]);

            points.add(new Point(x, y));
        }


        double sum = 0.0;
        for(int i=0; i<N; i++){
            Point p1 = points.get(i);
            Point p2 = points.get((i+1)%N);

            sum += (double)p1.x*p2.y - (double)p2.x*p1.y;
        }

        bw.write( String.format("%.1f", Math.abs(sum)/2.0));
        bw.flush();
    }

}

class Point{
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!