문제 설명
- 점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 ≤ dots의 원소 ≤ 100
- dots의 길이 = 4
- dots의 원소의 길이 = 2
- dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
- 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
- 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
- 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.
입출력 예
dots | result |
[[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
나만의 풀이
이 문제는 힘들었다 ㅜㅜ 2시간이 걸린 것 같다. 이 문제는 코드 구성이 힘들었다기 보다는 수학적 지식이 부족한 것이 문제였다. 그래도 풀 수 있었던 가장 큰 힌트는 기울기다. 결국 이것은 기울기가 같은 두 선이 있다면 평행을 이룬다.
그래서 우선 반복문을 이용해 기울기를 구했다. 기울기 식은 (x1, y1), (x2, y2)라는 좌표가 있다면 (y1 - y2) / (x1 - x2)를 하면 된다. 이유를 설명하면 길다. 구글링 해보세요~~
그런데 음수가 존재하면 평행이 되어도 오류가 날까봐 방지하는 코드는 구성했는데 생각을 해보니 선이 / 형태로 올라가면 양수고 \ 떨어지는 형태면 음수여야 한다. 그래서 오히려 음수 양수 있는 것이 더 정확한 식이 완성이 된다.
그 후 filter를 이용해 중복된 숫자만 남기고 length와 삼항연산자를 이용해 0 보다 크면 1을 아니면 0을 반환하게 했다!!
function solution(dots) {
let arr = [];
for (let i = 0; i < dots.length; i++) {
let j = 3;
while (i < j) {
arr.push( (dots[i][1] - dots[j][1]) / (dots[i][0] - dots[j][0]) );
j--;
}
}
return arr.filter((e, i) => arr.indexOf(e) !== i).length > 0 ? 1 : 0;
}
'프로그래머스 JS LV0' 카테고리의 다른 글
LV0 90 안전지대 (0) | 2022.12.26 |
---|---|
LV0 89 옹알이(1) (0) | 2022.11.30 |
LV0 87 겹치는 선분의 길이 (0) | 2022.11.28 |
LV0 86 연속된 수의 합 (0) | 2022.11.25 |
LV0 85 OX퀴즈 (0) | 2022.11.24 |