백준🔗
2166번: 다각형의 면적
첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.
www.acmicpc.net
문제
간단 풀이
다각형의 넓이는 신발끈 공식을 이용하면 풀 수 있다! (고등학교 때 행렬을 배우지 않은 나로서는 기억 저편으로 희미해져가던 공식인데.. 이번 문제를 풀면서 다시 찾아봤다.)
공식대로만 풀면 되겠군 하고 호다닥 풀어버릴 심산이었는데 자료형 문제로 '틀렸습니다'를 마주해버렸다.
좌표값이 최대 100,000까지 가기 때문에 계산 과정에서 int형의 범위를 벗어난다는 것을 인지하고(100,000*100,000 = 100,0000,0000 => int형 범위인 약 21억을 넘어선다.) 계산 결과인 sum1, sum2의 자료형은 double로 지정을 했는데(/2의 결과가 실수로 소수점까지 나와야하기 때문에 long이 아닌 double로 지정했다.), 처음에 입력을 받는 vertex 배열의 자료형을 int로 두어서 계속 틀렸습니다가 뜬 것이다.
계산 결과가 double이어도 계산에 사용되는 수가 int형이라면 범위를 벗어날 시 오버플로우가 발생한다!
는 것을 다시 확실히 하고 넘어가야겠다.. 기본이 부족해서 틀렸다고 할 수 밖에 없을 것 같다.
코드
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 NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
// 순서대로 x, y 좌표 배열에 저장하기 (첫 꼭짓점 좌표는 마지막에 한번 더 추가)
long[][] vertex = new long[N + 1][2];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
vertex[i][0] = Integer.parseInt(st.nextToken());
vertex[i][1] = Integer.parseInt(st.nextToken());
}
vertex[N][0] = vertex[0][0];
vertex[N][1] = vertex[0][1];
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < N; i++) {
sum1 += vertex[i][0] * vertex[i + 1][1];
sum2 += vertex[i][1] * vertex[i + 1][0];
}
System.out.println(String.format("%.1f", Math.abs(sum1 - sum2) / 2));
}
}
참고 자료
신발끈 공식 - 나무위키
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권
namu.wiki
[Java] 백준 2166번. 다각형의 면적 (골드5)
https://www.acmicpc.net/problem/2166 2166번: 다각형의 면적 첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는
nodingco.tistory.com