본문 바로가기
ps

[백준] - 1064 평행사변형

by FAPER 2024. 1. 2.

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA, yA), B(xB, yB), C(xC, yC)

이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.

만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

입력

첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

예제 입력 1 

0 0 0 1 1 0

 

예제 출력 1 복사

0.8284271247461898

 

 

풀이 방법 

 

점 3개가 좌표평면에서 주어졌을 때 일반적인 경우 이론상 3개의 평행사변형을 만들 수 있다.

 

케이스를 나눠보면 크게 4가지가 있는데, 

 

1. 점 3개가 수직 관계인 경우 -> 평행사변형이 하나만 나오므로 불가 (-1)

2. 점 3개가 일직선 상에 있는 경우 -> 평행사변형이 나올 수 없으므로 불가 (-1)

3. 점 3개가 모두 같은 거리를 가질경우(정삼각형이 될 때) -> 평행사변형이 하나만 나오므로 불가(-1)

 

4. 일반적으로 삼각형이 나올 때 

 

위 1,2,3을 예외처리해 주고 4. 의 경우에는 둘레이기때문에 각 변에 2를 곱해 쉽게 구할 수 있다.

 

코드

function distance(x1,y1, x2,y2){
    return Math.sqrt(Math.pow((x1-x2),2) + Math.pow((y1-y2),2))
}
function ccw(x1,y1,x2,y2,x3,y3){
    const num1 = (y3 - y1) * (x2 - x1);
uire('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number);
let A = distance(p[0],p[1],p[2],p[3]);
let B = distance(p[2],p[3],p[4],p[5]);
let C = distance(p[0],p[1],p[4],p[5]);

let lines = [A,B,C].sort((a,b)=>a-b);

if (
    (p[0] - p[2]) * (p[3] - p[5]) ===
    (p[2] - p[4]) * (p[1] - p[3])
  )
    console.log(-1);
  else if (
    (!(p[0] - p[2]) && !(p[2] - p[4])) ||
    (!(p[1] - p[3]) && !(p[3] - p[5]))
  )
    console.log(-1);
else if(!ccw(p[0],p[1],p[2],p[3],p[4],p[5])){
    let ans = [2 * A + 2 * B, 2* A + 2 * C, 2*B + 2*C].sort((a, b) => a - b);
    console.log(ans[2] - ans [0]);
}else{
    console.log("-1.0")
}

      

 

  

'ps' 카테고리의 다른 글

[백준 2916] 도영이가 만든 맛있는 음식 [JS]  (0) 2024.01.11
[백준] 15656 N과 M (7) Node js 풀이  (0) 2024.01.07
[백준] 3085 사탕 게임  (0) 2024.01.03
[백준] 11000 강의실 배정  (0) 2023.06.15
[백준] 9935 문자열 폭발  (0) 2023.06.11