# [일일코딩][완전탐색] 최소 직사각형
https://school.programmers.co.kr/learn/courses/30/lessons/86491
# 문제
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
| 명함번호 | 가로길이 | 세로길이 |
|---|---|---|
| 1 | 60 | 50 |
| 2 | 30 | 70 |
| 3 | 60 | 30 |
| 4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
#### 제한사항
sizes의 길이는 1 이상 10,000 이하입니다. sizes의 원소는 [w, h] 형식입니다. w는 명함의 가로 길이를 나타냅니다. h는 명함의 세로 길이를 나타냅니다. w와 h는 1 이상 1,000 이하인 자연수입니다.
# 입출력 예
입출력 예
| sizes | result |
|---|---|
| [[[60, 50], [30, 70], [60, 30], [80, 40]]] | 4000 |
| [[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]]] | 120 |
| [[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]]] | 133 |
# 내 풀이
function solution(sizes) {
let maxWidth = 0;
let maxHeight = 0;
for (const [width, height] of sizes) {
maxWidth = Math.max(maxWidth, Math.max(width, height));
maxHeight = Math.max(maxHeight, Math.min(width, height));
}
return maxWidth * maxHeight;
}
# [풀이]
- sizes를 반복문으로 돌린다.
- Math.max를 해서 가로,세로 중 큰 값을 width에 넣어준다
- max를 해서 나온 값과 maxWidth에 있는 값 중에서 더 큰 값을 maxWidth에 넣어준다.
- Math.min에서 작은 값을 height에 넣어준다.
- max를 해서 나온 값과 maxHeight에 있는 값 중에서 더 큰 값을 maxHeight에 넣어준다.
- 두 값을 곱해서 리턴해준다
#### 리뷰 ``` 처음 풀어보는 완전 탐색 문제였다. 보자마자 문제를 어떻게 풀어야 할지 몰라서 엄청 헤맸다. 해설을 계속 보던 중 결론은 이 문제는 가로,세로는 중요하지 않다는 것이다. 명함을 세로로 넣든 가로로 넣든 들어가기만 하면 된다는 것이다. 명함의 길고 짧은 길이를 알아내고, 명함의 가로세로 최소 길이만 파악하면 된다.