Algorithm/푼 문제

프로그레머스/Lv0/직사각형 넓이 구하기

안개바다 2023. 3. 24. 16:54

문제 설명

2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

제한사항

  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • -256 < dots[i]의 원소 < 256
  • 잘못된 입력은 주어지지 않습니다.

입출력 예

dots result
[[1, 1], [2, 1], [2, 2], [1, 2]] 1
[[-1, -1], [1, 1], [1, -1], [-1, 1]] 4

좌표의 순서가 고정이 아니라는 점을 고려하여

곽 좌표값의 차이를 사각형의 각 변의 길이로 놓고 문제를 해결했다.

function solution(dots) {
    const height = Math.abs(
        dots[0][0] === dots[1][0] ? dots[0][0]-dots[2][0] : dots[0][0]-dots[1][0])
    const width = Math.abs(
        dots[0][1] === dots[1][1] ? dots[0][1]-dots[2][1] : dots[0][1]-dots[1][1])
    return height*width;
}

그렇게 해서 dots[0][0] === dots[1][0] 이런 방식으로 좌표값의 차이를 구할 배열의 요소들을 구분해 값을 return 하는 방식으로 해결했다. 

다른 방식으로 리팩토링 하기 위해 이번에는 Math 내장메소드 중 Min 과 Max를 사용해 보았다.

function solution(dots) {
    let X = [],let Y = [];
    for(i=0;i<4;i++){
        X.push(dots[i][0]);
        Y.push(dots[i][1]);
    }
    return (Math.max(...X) - Math.min(...X)) * (Math.max(...Y) - Math.min(...Y))
}

풀이 제출 후 다른 분들의 풀이를 보던 중 마음에 들었던 풀이도 소개한다.

각각의 좌표값이 2종류 한정이기에 사용할 수 있는 new Set()을 이용한 방법이다.

const solution = dots => {
    const x = [...new Set(dots.map(p => p[0]))]
    const y = [...new Set(dots.map(p => p[1]))]
    return Math.abs((x[0] - x[1]) * (y[0] - y[1]))
}