[프로그래머스 | JS] Lv0. 평행

HICHULOG·2023년 7월 15일
0

프로그래머스

목록 보기
22/38
post-thumbnail

평행

📝 문제

점 네 개의 좌표를 담은 이차원 배열 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축과 평행한 경우는 주어지지 않습니다.

💡 풀이

function solution(dots) {
    const slopeArr = [];
    
    for(let i = 0 ; i < dots.length ; i ++) {
        for(let j = i+1 ; j < dots.length ; j ++) {
            const slope = (dots[i][1]-dots[j][1]) / (dots[i][0]-dots[j][0]);
            
            if(slopeArr.includes(slope)) return 1;
            slopeArr.push(slope);
        }
    }
    return 0
}

=> 직선이 평행하다는 것은 두 직선의 기울기가 같다는 것.

(직선의기울기=y값의변화량x값의변화량직선의 기울기 = \frac{y값의 변화량}{x값의 변화량})

기울기를 계산해 배열에 넣고 그 배열에 다음 계산한 기울기가 존재하면 두 기울기가 같아 평행이 되니 1을 반환하고 없으면 평행하지 않으므로 0 반환. 테스트 실패!!!

  • 이유: 내 풀이는 점4개를 각각 a,b,c,d라고 했을 때 a-b, a-c, a-d, b-c, b-d, c-d 경우를 생각한 풀이이다.
    문제를 보면'주어진 네 개의 점을 두 개씩 이었을 때'라고 했는데 아래와 같은 3가지 경우의 수 만을 의미하는 것 같다.
    [a-b, c-d],[a-c, b-d],[a-d, b-c]
    즉, 4개의 점들로 임의의 두 쌍을 만들었을 때 그 두 쌍이 이루는 직선이 서로 평행한지를 묻는 문제이다.
function solution(dots) {
    const [a,b,c,d] = dots;
    let result = 0;
    const s1 = (a[1]-b[1]) / (a[0]-b[0]);
    const s2 = (c[1]-d[1]) / (c[0]-d[0]);

    if(s1 === s2) result = 1;


    const s3 = (a[1]-c[1]) / (a[0]-c[0]);
    const s4 = (b[1]-d[1]) / (b[0]-d[0]);

    if(s3 === s4) result = 1;

    const s5 = (a[1]-d[1]) / (a[0]-d[0]);
    const s6 = (b[1]-c[1]) / (b[0]-c[0]);

    if(s5 === s6) result = 1;

    return result;
}

=> 3가지 경우 확인, 통과!!

✅ 다른 풀이

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]);
}

=> 반복되는 계산을 함수로 만들어 사용했다. const [a,b,c,d] = dots; 구조분해 할당을 해주면 더 간결한 코드를 얻을 수 있을 것 같다.

function solution(dots) {
    const [a,b,c,d] = dots
    
    if (calculateSlope(a,b) === calculateSlope(c,d))
        return 1;
    if (calculateSlope(a,c) === calculateSlope(b,d))
        return 1;
    if (calculateSlope(a,d) === calculateSlope(b,c))
        return 1;
    return 0;
}

function calculateSlope(arr1, arr2) {
    return (arr2[1] - arr1[1]) / (arr2[0] - arr1[0]);
}

🚀 TIL

  • 반복되는 식은 함수를 만들어 사용하면 간결하다.
profile
🚀 Front-end Dev

0개의 댓글