프로그래머스 JS LV0

LV0 88 평행

와라리요 2022. 11. 29. 13:04

문제 설명

 - 점 네 개의 좌표를 담은 이차원 배열  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