문제 개요
2차원 평면 위의 네 개의 점이 정사각형을 이루는지 판별하는 JavaScript 함수를 작성해야 합니다. 함수는 네 개의 인수를 받으며, 각 인수는 숫자 두 개로 구성된 배열로서 한 꼭짓점의 x, y 좌표를 나타냅니다. 네 꼭짓점이 정사각형을 형성하면 true, 그렇지 않으면 false를 반환하면 됩니다.
예시
입력 좌표가 다음과 같다고 가정해 보겠습니다.
const c1 = [1, 0]; const c2 = [-1, 0]; const c3 = [0, 1]; const c4 = [0, -1];
이때 출력은 다음과 같습니다.
const output = true;
이 네 좌표는 원점을 중심으로 하는 한 변의 길이가 2, 즉 넓이가 4인 정사각형을 정확하게 이루기 때문입니다.
접근 방식
핵심 아이디어는 네 점 사이의 모든 거리를 계산하는 것입니다. 서로 다른 두 점으로 만들 수 있는 쌍은 총 6가지이며, 네 점이 정사각형이라면 그중 4개는 길이가 모두 같은 변이고 나머지 2개는 길이가 같은 대각선입니다. 따라서 고유한 거리 값이 정확히 2개만 존재해야 합니다. 또한 중복된 좌표가 하나라도 있다면 정사각형이 될 수 없으므로 즉시 false를 반환합니다.
구현 코드
const c1 = [1, 0];
const c2 = [-1, 0];
const c3 = [0, 1];
const c4 = [0, -1];
const validSquare = (c1, c2, c3, c4) => {
const dist = (c1, c2) => (Math.sqrt(Math.pow(c1[0] - c2[0], 2) + Math.pow(c1[1] - c2[1], 2)));
const points = [c1, c2, c3, c4];
let lens = new Set();
for(let i = 0; i < points.length; i++){
for(let j = i + 1; j < points.length; j++){
if(points[i][0] == points[j][0] && points[i][1] == points[j][1]){
return false;
}
let dis = dist(points[i], points[j]);
lens.add(dis);
};
};
return lens.size === 2;
};
console.log(validSquare(c1, c2, c3, c4));출력 결과
콘솔에는 다음과 같이 출력됩니다.
true
코드 동작 원리
dist 함수는 피타고라스 정리를 이용해 두 점 사이의 유클리드 거리를 계산합니다. 이중 반복문을 통해 6개의 모든 점 쌍에 대한 거리를 구하고, Set 자료구조에 저장하여 중복 값을 자동으로 제거합니다. 마지막으로 Set의 크기가 2인지 확인하는데, 이는 '변의 길이'와 '대각선의 길이'라는 두 가지 고유 거리만 존재한다는 의미입니다. 이 조건을 만족하면서 중복 좌표가 없다면 네 점은 정사각형입니다.