BOJ_1064_평행사변형_JAVA
문제 : 평행사변형
링크 : BOJ_1064_평행사변형
접근 방식
세 점의 좌표가 주어지면, 임의의 점 하나를 추가하여 평행사변형을 만드는 문제이다.
만들어진 평행사변형의 최대 둘레 최소 둘레의 차이를 출력하면 된다.
또한 평행사변형이 만들어지지 않는 경우 -1.0을 출력한다.
일단 평행사변형이 만들어지지 않는 경우는 세 점이 한 직선상에 있는 경우를 뜻하고, 이는 3개의 점 중 2개의 점을 이은 직선의 기울기가 모두 같은 경우를 의미한다.
그 후 3개의 점을 기준으로 삼각형의 각 변의 길이를 피타고라스 정리를 이용하여 구했다.
마지막으로 3개의 변 중 2개의 변을 각각 2배하여 더하는 방식으로 평행사변형의 둘레를 구하고, 그중 최대, 최소값을 따로 저장하여 서로의 차를 출력해주었다.
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1064_평행사변형 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
double Ax = Double.parseDouble(st.nextToken());
double Ay = Double.parseDouble(st.nextToken());
double Bx = Double.parseDouble(st.nextToken());
double By = Double.parseDouble(st.nextToken());
double Cx = Double.parseDouble(st.nextToken());
double Cy = Double.parseDouble(st.nextToken());
double line1;
double line2;
double line3;
double max= 0;
double min = Double.MAX_VALUE;
// 기울기 - 나눗셈으로 구하면 0으로 나누는 경우가 생김
double a1 = (Ay-By)*(Bx-Cx);
double a2 = (By-Cy)*(Ax-Bx);
if(a1 == a2) {
System.out.println(-1.0);
return;
}
// A-B사이의 거리
line1 = Math.sqrt((double)(Ax-(double)Bx)*(Ax-Bx)+(Ay-By)*(Ay-By));
// B-C사이의 거리
line2 = Math.sqrt((double)(Bx-(double)Cx)*(Bx-Cx)+(By-Cy)*(By-Cy));
// C-A사이의 거리
line3 = Math.sqrt((double)(Cx-(double)Ax)*(Cx-Ax)+(Cy-Ay)*(Cy-Ay));
max = Math.max(max, line1*2+line2*2);
max = Math.max(max, line2*2+line3*2);
max = Math.max(max, line3*2+line1*2);
min = Math.min(min, line1*2+line2*2);
min = Math.min(min, line2*2+line3*2);
min = Math.min(min, line3*2+line1*2);
System.out.printf("%.15f",max-min);
}
}