최소직사각형 : 문제 링크
명함 번호 | 가로 길이 | 세로 길이 |
---|---|---|
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 이하인 자연수이다.
가로, 세로의 크기를 저정할 정수형 변수 width, height를 각각 0으로 초기화. 이 문제는 각 sizes[i]에서 둘 중 큰수중에 가장 큰수와 작은수중에 가장 큰수를 구하여 곱하여 풀면된다. for loop를 통해 sizes의 첫번째부터 마지막 원소까지 순환하고, max() 함수를 사용하여 w, h중에 큰 수를 width와 비교하여 더 큰 값을 width에 저장. 마찬가지로 max() 함수를 사용하여 w, h중에 작은 수를 height와 비교하여 더 큰 값을 height에 저장. loop 탈출 후, 최종적으로 저장된 width와 height를 곱한 값을 return
#include <vector>
using namespace std;
int solution(vector<vector<int>> sizes) {
int width = 0, height = 0;
for(int i = 0; i < sizes.size(); ++i) {
width = max(width, max(sizes[i][0], sizes[i][1]));
height = max(height, min(sizes[i][0], sizes[i][1]));
}
return width * height;
}