프로그래머스
[JavaScript] 최소직사각형 - 프로그래머스
jjangsh
2024. 8. 27. 11:12
문제 :
내 풀이 :
function solution(sizes) {
let maxW = 0;
let maxH = 0;
for (let i = 0; i < sizes.length; i++) {
if (sizes[i][0] > sizes[i][1]) {
if (maxW < sizes[i][0]) {
maxW = sizes[i][0];
}
if (maxH < sizes[i][1]) {
maxH = sizes[i][1];
}
} else {
if (maxW < sizes[i][1]) {
maxW = sizes[i][1];
}
if (maxH < sizes[i][0]) {
maxH = sizes[i][0];
}
}
}
return maxW * maxH;
}
1. 반복문을 통해 모든 명함 크기를 하나씩 검사한다.
2. 각 명함에 대해, 가로(sizes[i][0])와 세로(sizes[i][1]) 중 더 큰 값을 가로(maxW에 대응)로 설정하고, 더 작은 값을 세로(maxH에 대응)로 설정한다.
3. 반복문이 끝난 후 maxW에는 지갑의 가로 길이로 필요한 최댓값이, maxH에는 지갑의 세로 길이로 필요한 최댓값이 들어 있다.
4. 최종적으로 maxW와 maxH를 곱하여 지갑의 최소 면적을 계산하여 반환한다.
예시
예를 들어, sizes = [[60, 50], [30, 70], [60, 30], [80, 40]]가 주어진 경우:
- 첫 번째 명함: 60x50 → 가로 60, 세로 50으로 처리
- 두 번째 명함: 30x70 → 가로 70, 세로 30으로 처리
- 세 번째 명함: 60x30 → 가로 60, 세로 30으로 처리
- 네 번째 명함: 80x40 → 가로 80, 세로 40으로 처리
최종적으로 지갑의 최소 크기는 80 (가로) * 50 (세로) = 4000이 된다.
📌 코드가 너무 지저분하고 if문을 중첩해서 사용하니 가독성이 떨어져서 리팩토링 해보았다.
리팩토링 코드 :
function solution(sizes) {
let maxW = 0;
let maxH = 0;
sizes.forEach((size) => {
const [w, h] = size[0] > size[1] ? [size[0],size[1]] : [size[1],size[0]];
maxW = maxW < w ? w : maxW;
maxH = maxH < h ? h : maxH;
})
return maxW * maxH;
}
처음 작성했던 코드와 기능은 같지만 훨씬 깔끔해진 모습이다.
반복문은 forEach를 사용하여 명함 하나하나씩을 검사하고, 구조분해할당과 삼항연산자를 사용하여 가독성은 높이고 코드의 길이도 짧아졌다.