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