문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
기하란?
도형의 성질, 모양 등을 연구하는 수학의 한 분야
이 문제에 핵심은
1. N각형의 다각형 좌표가 주어진다.
2. 해당 다각형의 넓이를 결과로 출력한다.
3. 소수점 아래 둘째 자리에서 반올림을 진행한다.
처음 이 문제를 접근할 때 삼각형으로 만들어서 넓이의 합을 구하면 될 것이라는 것은 이해하였지만 점화식이 떠오르지 않아서 검색을 통해 점화식을 얻게 되었습니다.
점화식(신발끈 공식)
※신발끈 공식이 성립되려면 마지막에 첫 좌표가 저장되어야 합니다.!(중요!)
(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; //신발끈 공식 적용 후 반환
}
}
'백준' 카테고리의 다른 글
[백준] code.plus(BFS 알고리즘,JAVA)14442번, 벽 부수고 이동하기 2 (0) | 2022.06.24 |
---|---|
[백준] code.plus(BFS 알고리즘,JAVA)16946번, 벽 부수고 이동하기 4 (0) | 2022.06.23 |
[백준] code.plus(BFS 알고리즘,JAVA)12886번, 돌 그룹 (0) | 2022.06.21 |
[백준] 단계별로 풀어보기(단계:32, 트리에서의 동적 계획법,JAVA)1949번, 우수 마을 (0) | 2022.06.20 |
[백준] 단계별로 풀어보기(단계:32, 트리에서의 동적 계획법,JAVA)2533번, 사회망 서비스(SNS) (0) | 2022.06.19 |
댓글