Algorithm/Brutal Force

[완전탐색]최소 직사각형

Maison 2025. 1. 4. 16:36

문제

 

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다.
모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

 

 

접근 방법

#1차

 

1) 출력 정의
 - 모든 명함을 수납 할 수 있는 가장 작은 지갑. 

2) 문제 정의
 - 모든 명함을 정렬 (앞 큰것, 뒤 작은것)으로. 
 - 해당 명함들의 가로 세로값의 최댓값 찾기.

 3) 구현
  - 명함 정렬 
   -> 큰값은 앞으로 작은값은 뒤로.
  - 가로의 max값과 세로의 max값으로 지갑 만들기.

 

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int answer = 0;

    // 명함 정렬 큰값 앞, 작은 값 뒤.
    int width=0,length=0;

    for(auto vec : sizes)
    {
        if(vec[0]<vec[1])
            swap(vec[0],vec[1]);
        
        if(width<vec[0])
            width=vec[0];
        
        if(length<vec[1])
            length=vec[1];
    }

    answer = width*length;

    return answer;
}

 

#2차 (보완사항)

 

1) 출력 정의
 - 모든 명함을 수납 할 수 있는 가장 작은 지갑.

2) 문제 정의
 - 모든 명함을 정렬 (앞 큰것, 뒤 작은것)으로. 
 - 해당 명함들의 가로 세로값의 최댓값 찾기.

 

정렬할 필요 없음.
명함 배열의 값중 큰값을 너비, 작은 값을 높이로 구현

 

 3) 구현
  - width = 모든 명함의 max 값

  - length = 모든 명함의 min 값

 

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int answer = 0;

    // 명함 정렬 큰값 앞, 작은 값 뒤.
    int width=0,length=0;

    // 명함의 긴값과 현재 값중 max인 값.
    for(auto vec : sizes)
    {
        width = max(width,max(vec[0],vec[1]));
        length = max(length,min(vec[0],vec[1]));
    }

    answer = width*length;

    return answer;
}

 

 

위의 문제가 왜 완전탐색 문제인가?

명함을 자유롭게 회전할 수 있기 때문에 가능한 모든 경우의 수를 따져야 하기 때문이다.

 

하지만, 위의 문제는 최적화된 문제의 풀이를 정의할 수 있기때문에 그리디 방식으로도 풀이가 가능하다.

최적화된 문제 풀이 정의 
- 명함의 긴 부분을 width로 고정시키는 방법

그리디 방식
 - 부분 문제의 해로 전체 문제를 해결 할 수 있는 방식

 

위의 방식은 그리디 방식으로 풀이한 결과이다.