점 네 개의 좌표를 담은 이차원 배열 dots
가 다음과 같이 매개변수로 주어집니다.
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
dots | result |
---|---|
[[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
function solution(dots) {
dots.sort((a,b) => a[0] - b[0]); //[[1,4],[3,8],[9,2],[11,6]]
const xSide = Math.abs(dots[0][0] - dots[1][0]) === Math.abs(dots[2][0] - dots[3][0]);
const ySide = Math.abs(dots[0][1] - dots[1][1]) === Math.abs(dots[2][1] - dots[3][1]);
return (xSide && ySide) ? 1 : 0;
}
💡 코드 풀이
- 각 요소를 오름차순으로 나열하고
- 한 축과 다른 한 축의 높이 차이가 동일하다면 1을 리턴, 아니라면 0을 리턴하도록 코드를 짰다.
💡 문제점
- 다른 케이스들은 다 통과했는데, 테스트케이스 1번과 10번이 통과되지 않았다.
- 해당 케이스를 살펴보니 “두 직선이 일치하는 경우” 에도 1을 리턴하도록 되어 있다는 사실을 알게 되었다.
function solution(dots) {
let x1 = dots[0][0]
let y1 = dots[0][1]
let x2 = dots[1][0]
let y2 = dots[1][1]
let x3 = dots[2][0]
let y3 = dots[2][1]
let x4 = dots[3][0]
let y4 = dots[3][1]
if (Math.abs((x1 - x2) * (y3 - y4)) == Math.abs((y1 - y2) * (x3 - x4))) {
return 1
}
if (Math.abs((x1 - x3) * (y2 - y4)) == Math.abs((y1 - y3) * (x2 - x4))) {
return 1
}
if (Math.abs((x1 - x4) * (y2 - y3)) == Math.abs((y1 - y4) * (x2 - x3))) {
return 1
}
return 0
}
💡 코드 풀이
- 케이스를 3개로 구분하기 위해 각각의 좌표를 변수로 지정하고
- 높이가 아닌 기울기로 조건을 바꿔줬다.
💡 배운점
- 반례를 주의하자 !