코드 복사/붙여넣기 하는 당신이 아름답습니다.

1064 : 평행사변형

풀이

hypot(a, b)는 a와 b를 높이, 너비로 하는 빗변의 길이를 구해주는 함수이다.


평행사변형이 만들어질 수 없는 경우를 찾아보자.

둘 이상의 점이 겹치거나, 세 점이 한 직선 위에 있으면 (= 기울기가 같으면) 사각형이 될 수 없다.

ccw에서 기울기를 구하는 식을 가져다 쓰자!

여기에 개꿀개꿀 공식이 써있으니 참고하자!

둘 이상의 점이 겹치는 경우도 한 직선 위에 있는 경우이므로 별개로 처리해줄 필요는 없다. (개꿀!)


이제 평행사변형의 둘레의 길이를 찾아보자.

먼저, 남아있는 하나의 점을 찾을 필요가 없음을 알아야한다.

평행사변형은 마주한 두 변의 길이가 같으므로, 주어진 세 점의 좌표만으로 둘레를 구할 수 있다.

여기까지만 눈채챘다면 (아마 조금 더럽고 길게) 구현이 가능할 것이다.

여기서 평행사변형 구성이 가능한 모든 경우에, 최대 둘레와 최소 둘레에 겹치는 변이 존재함을 알 수 있다.

따라서 복잡하게 계산할 필요 없이 a, b, c로 만들 수 있는 빗변만 모두 구해서 계산해주면 된다.

코드

#include <stdio.h>
#include <algorithm>
using namespace std;
int ax, ay, bx, by, cx, cy;
int main() {
	scanf("%d %d %d %d %d %d", &ax, &ay, &bx, &by, &cx, &cy);
	double a = hypot(bx-cx,by-cy), b = hypot(cx-ax,cy-ay), c = hypot(ax-bx,ay-by);
	if ((bx-ax)*(cy-ay) == (by-ay)*(cx-ax)) puts("-1");
	else printf("%.10lf", (max(a,max(b,c)) - min(a,min(b,c))) * 2);
	return 0;
}

아무말

백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge

wookje.kwon's profile image

wookje.kwon

2017-10-19 17:44

Read more posts by this author