민혁이의 IT스토리

[프로그래머스/JS] - 최소직사각형 본문

알고리즘/코딩테스트

[프로그래머스/JS] - 최소직사각형

FE_Minhyuk 2026. 4. 30. 13:29

 

문제 설명

다양한 모양과 크기의 명함들을 모두 수납할 수 있는 가장 작은 지갑을 만들려고 합니다. 모든 명함은 가로로 눕히거나 세로로 세워서 수납할 수 있습니다.
예를 들어, 가로 크기가 80, 세로 크기가 50인 명함을 가로로 눕히면 (80, 50)이 되고, 세로로 세우면 (50, 80)이 됩니다. 모든 명함을 수납할 수 있는 가장 작은 지갑의 크기(가로 x 세로)를 리턴해주세요.

문제 요약

- 모든 명함의 가로, 세로 중 긴 쪽을 한 방향(예: 가로)으로 몰아넣는 것이 핵심입니다.
- 그렇게 정렬된 상태에서 가로의 최댓값과 세로의 최댓값을 곱하면 정답이 됩니다.

 

 

출력 예

 

 

제출 코드

function solution(sizes) {
    // 1. 각 명함의 가로, 세로를 비교해 작은 값이 앞에 오도록 정렬합니다.
    const sortSizes = sizes.map(e => e.sort((a, b) => a - b));
    
    let MaxH = 0;
    let MaxW = 0;
    
    // 2. 정렬된 명함들을 돌면서 가로의 최댓값과 세로의 최댓값을 찾습니다.
    sortSizes.forEach((e, indx) => {
        if (e[0] > MaxH) MaxH = e[0];
        if (e[1] > MaxW) MaxW = e[1];
    })
    
    return MaxW * MaxH;
}

 

 

💡 AI 피드백: 내가 놓쳤던 'JS 문법의 디테일'


1. sort()는 원본을 파괴한다 (Side Effect)

제 코드의 첫 번째 줄을 보면 sizes.map(e => e.sort(...))라고 되어 있습니다. 저는 map을 썼으니 새로운 배열이 만들어지고 원본 sizes는 안전할 것이라고 생각했습니다.

하지만 Array.prototype.sort()는 'In-place' 메서드입니다. 즉, 새로운 배열을 반환하는 게 아니라 원본 배열 자체를 직접 수정합니다. 비록 map 안에서 실행되더라도, sizes 내부에 들어있는 각각의 작은 배열 e들의 순서를 실제로 바꿔버리는 것이죠.

  • 해결책: 원본을 유지해야 한다면 [...e].sort()처럼 스프레드 연산자로 복사본을 만들어 정렬하거나, 캡처본의 고수들처럼 w < h ? [h, w] : [w, h]와 같이 삼항 연산자로 새로운 배열을 반환하는 것이 더 안전하고 JS다운 방식이라는 것을 배웠습니다.

2. 인덱스 접근([0])보다는 구조 분해 할당

저는 e[0], e[1]처럼 인덱스 번호로 값에 접근했습니다. 하지만 이는 코드의 가독성을 떨어뜨리고, 나중에 배열 구조가 복잡해지면 TypeError: Cannot read properties of undefined (reading '0') 같은 에러를 만날 확률이 높습니다.

  • 배운 점: forEach(([w, h]) => { ... }) 처럼 매개변수 단계에서부터 이름을 붙여주는 구조 분해 할당을 쓰면 코드가 훨씬 명확해집니다