| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 혼자 공부해서 개발까지
- 해시
- 정렬
- 정글
- HTML기초
- 팀프로젝트
- 백준
- 코딩
- 알고리즘
- c언어
- DFS
- 알고리즘 기초
- 개발자
- html
- frontend
- 그래프
- js
- javascript
- 코딩테스트
- Mini-React
- CSS
- BFS
- Git
- 프로그래머스
- 크래프톤 정글
- 그리디
- 프론트앤드
- react
- 프론트엔드
- Python
Archives
- Today
- Total
민혁이의 IT스토리
[프로그래머스/JS] - 최소직사각형 본문
문제 설명
다양한 모양과 크기의 명함들을 모두 수납할 수 있는 가장 작은 지갑을 만들려고 합니다. 모든 명함은 가로로 눕히거나 세로로 세워서 수납할 수 있습니다.
예를 들어, 가로 크기가 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]) => { ... }) 처럼 매개변수 단계에서부터 이름을 붙여주는 구조 분해 할당을 쓰면 코드가 훨씬 명확해집니다
'알고리즘 > 코딩테스트' 카테고리의 다른 글
| [프로그래머스/JS] - 타겟 넘버 (0) | 2026.05.05 |
|---|---|
| [프로그래머스/JS] - H-Index (0) | 2026.04.28 |
| [프로그래머스/JS] - 체육복 (0) | 2026.04.27 |
| [프로그래머스/JS] - 전화번호 목록 (0) | 2026.04.24 |
| [프로그래머스/JS] - 포켓몬 (0) | 2026.04.22 |