평행
문제설명 :
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한 사항
- dots의 길이 = 4
- dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
- 0 ≤ x, y ≤ 100
- 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
- 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
- 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.
입출력 예
dots | result |
[[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
첫번째 접근
: 두 선이 평행하다는 말은 기울기가 같다는 의미이므로 두 점을 이은 두 선의 기울기를 구하여 문제를 풀었다.
이중 for문을 돌며 두 점을 이은 선분의 기울기를 구한 후 slope 배열에 넣어주었다. 이후 새로 구한 기울기 값이 slope 배열에 있는 경우, return 1을 하여 문제를 해결하고자 하였다. 하지만 최종 통과가 되지 않았다.
function solution(dots) {
let slope = []
for(let i=0; i<dots.length - 1; i++) {
for(let j = i + 1; j < dots.length; j++) {
let item = (dots[i][1] - dots[j][1]) / (dots[i][0] - dots[j][0])
if(slope.indexOf(item) > -1) return 1
else slope.push(item)
}
}
return 0
}
두번째 접근
: 뭐가 문제일까. 해당 부분은 질문하기 페이지에서 힌트를 얻었다. [[1, 1], [4, 2], [5, 5], [7, 7]] 의 경우 위 코드는 통과되지 않는다. 이유는 [1, 1], [5, 5]과 [1, 1], [7, 7]을 잇는 두 선의 기울기는 동일하므로 위 코드는 1을 반환하지만, 실제로는 0을 반환해야한다. 이처럼 하나의 좌표가 중복 계산되는 경우가 있으므로 해당 경우에 대한 예외처리가 되지 않아 최종 통과가 되지 않았다. 해당 문제를 해결하기 위해 0번째 좌표는 고정시킨 후, 0번째 좌표와 이을 좌표를 반복문을 사용해 구한후(i) 기울기(slope1)를 구했다. 나머지 좌표는 새로운 배열 arr에 넣은 후 두 좌표를 이은 새로운 기울기(slope2)를 구했다. 해결했다.
function solution(dots) {
let slope1
let arr = []
for(let i = 1; i < dots.length; i++) {
for(let j = 1; j < dots.length; j++) {
slope1 = (dots[0][1] - dots[i][1]) / (dots[0][0] - dots[i][0])
if(j !== i){
arr.push(dots[j])
}
}
let slope2 = (arr[0][1] - arr[1][1]) / (arr[0][0] - arr[1][0])
if(slope1 === slope2) return 1
else arr = []
}
return 0
}
solution
function solution(dots) {
if (calculateSlope(dots[0], dots[1]) === calculateSlope(dots[2], dots[3]))
return 1;
if (calculateSlope(dots[0], dots[2]) === calculateSlope(dots[1], dots[3]))
return 1;
if (calculateSlope(dots[0], dots[3]) === calculateSlope(dots[1], dots[2]))
return 1;
return 0;
}
function calculateSlope(arr1, arr2) {
return (arr2[1] - arr1[1]) / (arr2[0] - arr1[0]);
}
function solution(dots) {
if((dots[0][1] - dots[1][1]) / (dots[0][0] - dots[1][0]) === (dots[2][1] - dots[3][1]) / (dots[2][0] - dots[3][0])) return 1
if((dots[0][1] - dots[2][1]) / (dots[0][0] - dots[2][0]) === (dots[1][1] - dots[3][1]) / (dots[1][0] - dots[3][0])) return 1
if((dots[0][1] - dots[3][1]) / (dots[0][0] - dots[3][0]) === (dots[2][1] - dots[1][1]) / (dots[2][0] - dots[1][0])) return 1
return 0
}
// 케이스가 3가지 경우만 존재하니 이렇게 풀수 있을 듯 하다.
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
JS Practice) 프로그래머스 Lv.1 : 평균 구하기 (0) | 2023.05.13 |
---|---|
JS Practice) 프로그래머스 : 짝수와 홀수 (0) | 2023.05.12 |
JS Practice) 프로그래머스 : 겹치는 선분의 길이 (1) | 2023.05.03 |
JS Practice) 프로그래머스 : 안전지대 (0) | 2023.05.02 |
JS Practice) 프로그래머스 : 연속된 수의 합 (0) | 2023.05.01 |