[js] 직사각형 넓이 구하기 (lv.0)

sookyoung.k·2024년 5월 25일
0
post-thumbnail

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

제한사항

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

나의 풀이

function solution(dots) {   
    // 가로 구하기 
    let getWidth = (arr) => {
        let [x1, x2, x3, x4] = [...arr];
        let right = Math.max(x1[0], x2[0], x3[0], x4[0]);
        let left = Math.min(x1[0], x2[0], x3[0], x4[0]);
        
        return right - left;
    }
    // 세로 구하기
    let getHeight = (arr) => {
        let [y1, y2, y3, y4] = [...arr];
        let up = Math.max(y1[1], y2[1], y3[1], y4[1]);
        let down = Math.min(y1[1], y2[1], y3[1], y4[1]);
        
        return up - down;
    }
    
    return getWidth(dots) * getHeight(dots);
}
  • 가로를 구하는 함수와... 세로를 구하는 함수를 만들어서 풀었다. 개인적으로 혼자 너무 뻘뻘거리며 풀어서 다른 풀이가 너무 궁금했던 문제였다.
  • 가로 길이 계산: x좌표들을 추출하여 최댓값과 최솟값의 차이를 계산한다.
  • 세로 길이 계산: y좌표들을 추출하여 최댓값과 최솟값의 차이를 계산한다.
  • 넓이 계산: 구한 가로 길이와 세로 길이의 곱

다른 풀이 1

function solution(dots) {
    let x = [],
        y = [];

    for (let pos of dots) {
        x.push(pos[0]);
        y.push(pos[1]);
    }

    return (Math.max(...x) - Math.min(...x)) * (Math.max(...y) - Math.min(...y))
}
  • 지저분하게 풀지 않을 수 있는 방법... for of 문을 이용해서 아예 x 좌표들을 추출한 값을 x 배열에 할당, y 좌표들을 추출한 값을 y 배열에 할당한다.
  • 로직 자체는 같은데... 이런 방법이!

다른 풀이 2

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]))
}
  • map() 함수를 이용해서 각 점의 x, y좌표를 추출한 후 new Set()을 사용하여 중복을 제거한 후 배열로 변환한다.
  • 가로 길이와 세로 길이를 구한 후 절대값을 취하여 반환한다. (두 좌표 간의 차이가 음수가 될 수 있기 때문에 절대값을 구한다.)
profile
영차영차 😎

0개의 댓글