본문 바로가기
백준

[1064] 평행사변형

by kmyobin 2022. 9. 26.


규칙은 그리 어렵지 않다.

 

 

주어진 3개의 점이 만약 일직선상에 놓여있다면 ? 

이는 사각형이 만들어질 수 없는 조건이므로 -1.0을 출력한다.

 

 

사각형의 둘레를 구하는 것은 좀 더 생각을 해봐야 한다.

나는 모든 경우의 수를 생각하고 일치하는 조건들을 찾는 타입이다.

결국 찾았다.

보라색을 보시라

저 보라색으로 쓰여있는 것이 우리가 따져볼 수 있는 둘레의 경우의 수이다.

저기서 최댓값, 최솟값을 구해 차이를 출력하면 되는 문제였다.

 

 

두 점 사이의 거리를 구할 때는 피타고라스의 정리가 이용된다.

이는 중학교 때 배운 것이니 코드로 직접 보일 것이다.

 

소수점의 자리수도 생각해줘야 한다. 기본은 6자리까지밖에 안나오기 때문에 %.16f를 사용하든 cout<<fixed; cout.precision(16)을 설정하여 소수점을 많이 출력되게 만들어 오차를 줄여야 한다.

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

struct xy {
	double x;
	double y;
};

struct xy xy[3];

bool cmp1(struct xy A, struct xy B) {
	if (A.x == B.x) {
		return A.y < B.y;
	}
	return A.x < B.x; // x 오름차순 정렬
}

double PITA(int x1, int y1, int x2, int y2) { // 두 점 사이의 길이
	return sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
}

int main() {
	for (int i = 0; i < 3; i++)
	{
		cin >> xy[i].x >> xy[i].y;
	}

	sort(xy, xy + 3, cmp1);
	
	if ((xy[0].y - xy[1].y) * (xy[1].x - xy[2].x) == (xy[1].y - xy[2].y) * (xy[0].x - xy[1].x)) {
		// 한 직선에 3개의 점이 있으면(기울기가 같으면) 사각형이 만들어 질 수 없음
		// 하지만 나눗셈(/)을 쓴다면 division by zero가 발생할 수 있으므로 사용하지 않음
		cout << "-1.0";
	}
	else
	{
		double AB = PITA(xy[0].x, xy[0].y, xy[1].x, xy[1].y);
		double AC = PITA(xy[0].x, xy[0].y, xy[2].x, xy[2].y);
		double BC = PITA(xy[1].x, xy[1].y, xy[2].x, xy[2].y);
		double sum1 = 2 * (AB + AC);
		double sum2 = 2 * (AB + BC);
		double sum3 = 2 * (BC + AC);


		double maximum = max(sum3, max(sum1, sum2));
		double minimum = min(sum3, min(sum1, sum2));

		printf("%.16lf", (maximum - minimum));
	}
}

정말 어이없게 처음에 구조체에서 double이 아닌 float를 써서 계속 틀렸다..

 

'백준' 카테고리의 다른 글

[2512] 예산  (0) 2022.09.27
[1094] 막대기  (0) 2022.09.27
[1904] 01타일  (0) 2022.09.25
[9184] 신나는 함수 실행  (0) 2022.09.23
[14889] 스타트와 링크  (0) 2022.09.21

댓글