/ BOJ

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);
	}

}