본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:33, 기하2,JAVA)2166번, 다각형의 면적

by 열정적인 이찬형 2022. 6. 22.

문제 링크

 

2166번: 다각형의 면적

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


 

접근 방법

기하란?

도형의 성질, 모양 등을 연구하는 수학의 한 분야

 

기하학 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

이 문제에 핵심은

1. N각형의 다각형 좌표가 주어진다.

2. 해당 다각형의 넓이를 결과로 출력한다.

3. 소수점 아래 둘째 자리에서 반올림을 진행한다.

 

처음 이 문제를 접근할 때 삼각형으로 만들어서 넓이의 합을 구하면 될 것이라는 것은 이해하였지만 점화식이 떠오르지 않아서 검색을 통해 점화식을 얻게 되었습니다.

 

점화식(신발끈 공식)

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

※신발끈 공식이 성립되려면 마지막에 첫 좌표가 저장되어야 합니다.!(중요!)

 

(x1, y1) , (x2, y2), (x3, y3) ..... (xn, yn)일 때

점화식 : |x1*y2 -x2*y1 + x2*y3 - x3*y2.....|/2

 

예제입력1

(0, 0) ,(0, 10), (10, 10), (10, 0)
 
점화식 적용

|0*10 - 0*0 + 0*10 - 10*10 + 10*0 - 10*10| / 2

 

|0 - 0 + 0 - 100 + 0 - 100| /2

 

|-200|/2 

 

200/2 = 100.0 

 

반올림 후 결과 출력!

 

결과:  100.0 출력

 

  • BufferedReader를 사용하여 입력 값을 저장하였습니다.
  • StringTokenizer를 사용하여 다각형의 좌표를 저장합니다.
  • 신발끈 공식으로 다각형의 넓이를 구하는 cal함수를 실행하였습니다.
  • BufferedWriter에 넓이를 소수 둘째 자리에서 반올림한 값을 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.
  • cal함수는 신발끈 공식을 적용하여 다각형의 넓이를 반환합니다.

 

결과 코드

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

public class Main {
	//좌표 관련 클래스
    static class position{
        long x,y;
        public position(long x, long y) {
            this.x = x;
            this.y = y;
        }
    }
    static int N;
    static ArrayList<position> list = new ArrayList<>();	//좌표 저장 리스트
    static public void  main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력값 처리하는 BufferedReader
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과값 출력하는 BufferedWriter
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        //좌표 값 저장
        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine()," ");
            long a = Long.parseLong(st.nextToken());
            long b = Long.parseLong(st.nextToken());
            list.add(new position(a,b));
        }
        list.add(list.get(0));	//첫 좌표 마지막에 다시 저장!(중요)
        double result = cal();	//신발끈 공식으로 다각형 넓이 구하기
        //소수 둘째 자리에서 반올림한 값 BufferedWriter 저장
        bw.write(String.format("%.1f", result));
        bw.flush();	//결과 출력
        bw.close();
        br.close();
    }
    //신발끈 공식 적용하는 함수
    static double cal(){
        long sumA = 0;	//x1*y2 형식의 합
        long sumB = 0;	//x2*y1 형식의 합
        for(int i=0;i<list.size()-1;i++){
            long x1 = list.get(i).x;
            long y1 = list.get(i).y;

            long x2 = list.get(i+1).x;
            long y2 = list.get(i+1).y;

            sumA += x1 * y2;
            sumB += x2 * y1;
        }
        return Math.abs(sumA-sumB) / 2.0;	//신발끈 공식 적용 후 반환
    }
}

댓글