본문 바로가기

Algorithm/Math

(C++) - 백준(BOJ) 1064 : 평행사변형

반응형

https://www.acmicpc.net/problem/1064

 

1064번: 평행사변형

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나

www.acmicpc.net

점 사이의 거리, 기울기를 이용해 평행사변형 생성가능 여부를 결정하는 수학 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

점의 x,y좌표를 저장하기 위해 struct Point를 선언 합니다. Point a,b,c점을 선언 후 선분 ab, bc, ac를 의미하는 변수 abLen, bcLen, acLen, 둘레의 길이를 저장할 변수 len1, len2, len3을 선언 후 a, b, c의 좌표를 입력받습니다.

📔 풀이과정

1. 평행사변형이 될 수 없는 경우

두 선분의 기울기가 같은 경우입니다. ab, bc선분의 기울기를 getInclination함수를 수행해 같다면 -1.0을 출력 후 program을 종료합니다.

2. 평행사변형이 되는 경우

선분 ab, bc, ac의 길이를 getLength함수를 이용해 구한 뒤 저장해줍니다.

이 후 3개의 선분 중 2개를 이용해 평행사변형의 둘레길이를 구할 수 있습니다. 이를 len1, len2, len3에 맞춰 저장해줍니다.

📔 정답출력

len1, len2, len3의 최대와 최소 차이를 소숫점 16자리까지 출력해줍니다. 상대오차는 주로 출력예시 답에 나오는 소숫점 자리만큼 고려해주면 됩니다. 


📕 Code

#include <bits/stdc++.h>
using namespace std;

struct Point{ double x,y; };
Point a, b, c;
double abLen, acLen, bcLen, len1, len2, len3;

double getLength(Point a, Point b){
  double x = a.x - b.x;
  double y = a.y - b.y;
  return sqrt(x*x + y*y);
}

double getInclination(Point a, Point b){
  return abs(a.y-b.y) / abs(a.x- b.x);
}

int main(){
  cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
  if(getInclination(a, b) == getInclination(b, c)) {cout << "-1.0"; return 0;}

  abLen = getLength(a, b);
  bcLen = getLength(b, c);
  acLen = getLength(a, c);

  len1 = (abLen + bcLen) * 2;
  len2 = (acLen + bcLen) * 2;
  len3 = (abLen + acLen) * 2;
  
  printf("%.16f",max({len1, len2, len3}) - min({len1, len2, len3})); 
}