반응형
[Gold V] 다각형의 면적 - 2166
분류
기하학, 다각형의 넓이
문제 설명
2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으로 이루어진 다각형이 있다. 이 다각형의 면적을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.
출력
첫째 줄에 면적을 출력한다. 면적을 출력할 때에는 소수점 아래 둘째 자리에서 반올림하여 첫째 자리까지 출력한다.
풀이 및 코드
다각형의 면적을 구하는 문제는 "신발끈 공식" 을 이용하여 풀 수 있다.
신발끈 공식
좌표평면상 점의 좌표를 이용하여 볼록 및 오목 다각형의 넓이를 계산하는 공식으로, n각형의 각 꼭짓점을 시계 반대 방향 순서대로
`P1 (x1 ,y1 )`, `P2 (x2 ,y2 )`, `P3 (x3 ,y3 )`, ⋯, `Pn (xn ,yn )`이라 할 때, 그 넓이는 아래와 같다.
이때 모양이 아래와 같이 신발끈과 같다고 하여 신발끈 공식이라고 한다.
이를 활용해서 문제를 푼 코드는 아래와 같다.
주의❗️
두 좌표 값을 곱할 때 int 범위를 넘을 수 있다
2를 나눌 때 소수점 밑의 자리가 버림이 되지 않도록 한다.
-> double 자료형 사용
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 좌표 개수 n
int[] x = new int[n+1]; // x좌표 배열. x0, x1, ... xn, x0 을 담을 것이므로 크기는 n+1
int[] y = new int[n+1]; // y좌표 배열. y0, y1, ... yn, y0 을 담을 것이므로 크기는 n+1
StringTokenizer st;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
x[i] = Integer.parseInt(st.nextToken());
y[i] = Integer.parseInt(st.nextToken());
}
x[n] = x[0];
y[n] = y[0];
// (x1y2 + x2y3 + ... + xny0) - (x2y1 + x3y2 + ... + x0yn) 구하기
double sum = 0;
for(int i = 0; i < n; i++){
sum += (double)x[i]*y[i+1];
sum -= (double)x[i+1]*y[i];
}
System.out.printf("%.1f",Math.abs(sum)/2); // 2로 나눈 후 출력
}
}
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Gold V] 치킨 배달 - 15686 (0) | 2024.12.22 |
---|---|
[백준/Gold IV] 행렬 제곱 - 10830 (1) | 2024.12.21 |
[백준/Silver II] A → B - 16953 (0) | 2024.12.19 |
[백준/Silver II] N과 M (12) - 15666 (1) | 2024.12.18 |
[백준/Silver III] N과 M (4) - 15652 (0) | 2024.12.17 |