자료구조 및 알고리즘/JavaScript Practice

JS Practice) 프로그래머스 : 직사각형 넓이 구하기

Ryomi 2023. 4. 6. 09:04
728x90
반응형

 

 

직사각형 넓이 구하기

문제설명 :

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

 

첫번째 접근

: 네 개의 좌표가 주어질 때, dots의 0번과 1번 좌표를 가져와 너비를 구하고, 0번과 3번의 좌표를 가져와 높이를 구해 곱해주었다. 하지만 최종 제출은 0점...?

function solution(dots) {
    let width = dots[1][0] - dots[0][0];
    let height = dots[3][1] - dots[0][1]
    return width * height;
}

 

 

두번째 접근

: 왜 일까...? 혹시나 해서 '[[-5, 2], [0, 2], [0, -1], [-5, -1]]'의 테스트 케이스를 추가하니, return 값이 음수나 나왔다. 그래서 Math.abs()를 사용했다. 하지만 역시 최종 제출은 0점....ㅜ

function solution(dots) {
    let width = dots[1][0] - dots[0][0];
    let height = dots[3][1] - dots[0][1]
    return Math.abs(width * height);
}

 

세번째 접근

: 이번에도 예시의 함정에 빠졌다. 문제 어느 곳에서도 좌표가 시계방향으로 제공된다는 말이 없다. 즉, 좌표가 섞여서 제공될 수 있다는 것이다. 해당 부분을 고려하려 x와 y의 좌표값을 각각 구해 max값에서 min값을 빼 w와 h값을 구했다. 최종 통과가 되었다. 

function solution(dots) {
    let widths = dots.map(el => el[0])
    let heigths = dots.map(el => el[1])
    
    let width  = Math.max(...widths) - Math.min(...widths)
    let height = Math.max(...heigths) - Math.min(...heigths)
    return width * height
}

 

 

solution

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

// Set을 사용하면 x와 y는 각각 2개의 값을 갖게 된다. 

728x90
반응형