문제
평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. 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 |