Coding/코딩테스트 준비

[C++] 프로그래머스 - 최소직사각형 (Lv.1)

__Lucie__ 2022. 9. 10. 20:54

문제 설명

 

생각하기

처음에는 sizes의 크기만큼 돌면서 각각 sizes[i][0]과 sizes[i][1] 의 가장 큰 값을 w, h에 담고,

모든 명함을 다 담을 수 있는지 True, False로 반환하는 bool isOk() 함수를 만들어,

만약 다 담을 수 있다면 다음으로 큰 값을 w, h에 담는 방법을 생각해 보았다.

 

하지만 이렇게 하면 생각할 것이 너무 많아졌다. 

'다음으로 큰 값'을 계속 loop를 돌며 탐색해야 하고 (전체 배열 탐색), 

w, h 중 어떤 변수를 다음으로 큰 값을 담을지를 정해야 한다. (총 3가지 경우의 수가 나옴)

 

그래서 다시 생각해보니, 처음에 sizes[i][0], sizes[i][1] 중에서 sizes[i][0]이 더 크도록 설정해주고 (sizes[i][0]보다 sizes[i][1]이 더 크다면 swap)

w에는 sizes[i][0] 중 가장 큰 값을, h에는 sizes[i][1] 중 가장 큰 값을 저장해

마지막 answer에는 w와 h를 곱한 값을 넣어 리턴하면 된다.

 

코드

#include <string>
#include <vector>
using namespace std;

int solution(vector<vector<int>> sizes) {
    int answer = 0;
    int w=0, h=0;
    for(int i=0; i<sizes.size(); i++){
        if(sizes[i][0] < sizes[i][1]){
            int tmp = sizes[i][0];
            sizes[i][0] = sizes[i][1];
            sizes[i][1] = tmp;
        }
    }
    
    for(int i=0; i<sizes.size(); i++){
        if(w<sizes[i][0])
            w = sizes[i][0];
        if(h<sizes[i][1])
            h = sizes[i][1];
    }
    answer = w*h;
    return answer;
}

 

결과