[JS] 백준 알고리즘 Node.js 1064. 평행사변형

2023. 3. 8. 10:47코딩연습

1. 문제

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

 

1064번: 평행사변형

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

www.acmicpc.net

 

2. 풀이

1. 만들 수 있는 평행사변형 중 가장 큰 둘레의 길이와 가장 작은 둘레의 길이의 차이를 구해야 한다.

2. 문제에서 주어진 점 3개를 이용하여 각각의 길이를 구한 후, 이들 중 가장 긴 변의 길이와 가장 짧은 변의 길이를 찾음.

* 피타고라스의 정리 이용

let ab_length = Math.sqrt((ax - bx)**2 + (ay - by)**2, 2);
let ac_length = Math.sqrt((ax - cx)**2 + (ay - cy)**2, 2);
let bc_length = Math.sqrt((bx - cx)**2 + (by - cy)**2, 2);

let result = Math.max(ab_length, ac_length, bc_length) - Math.min(ab_length, ac_length, bc_length);

 

3. 평행사변형을 만들 수 없는 경우는 점 3개가 동일한 기울기를 가질 경우, 즉 한 직선에 모두 올라가는 경우이다.

if( (ax - bx) * (ay - cy) === (ax - cx) * (ay - by) ){
    console.log("-1.0");
}

 

4. 둘레의 길이를 구하기 위해서 result 의 값에 2배를 해주어야 한다.

console.log(2 * result);

 

5. 종합!

const [ax,ay,bx,by,cx,cy] = require('fs').readFileSync('/dev/stdin').toString().split(' ').map(Number);

function main(){
    if( (ax - bx) * (ay - cy) === (ax - cx) * (ay - by) ){
        console.log("-1.0");
    } else {
        let ab_length = Math.sqrt((ax - bx)**2 + (ay - by)**2, 2);
        let ac_length = Math.sqrt((ax - cx)**2 + (ay - cy)**2, 2);
        let bc_length = Math.sqrt((bx - cx)**2 + (by - cy)**2, 2);
        
        let result = Math.max(ab_length, ac_length, bc_length) - Math.min(ab_length, ac_length, bc_length);
        
        console.log(2 * result);
    }
}

main();

 

3. 정리

처음 D점을 어떻게 구해야 하나 생각했었다. 문제에서 둘레의 길이만 구해야 한다는 점을 보고 D점을 찾지 않고도 문제를 해결할 수 있다는 생각을 하게 되었다. 다양한 방식으로 문제에 접근할 수 있도록 문제를 꼼꼼히 읽어야 한다는 생각을 했다.