BaekJoon

Brute Force -10881 C++

장우박 2023. 8. 2. 21:25

문제


프로도는 네오에게 줄 생일 선물을 세 개 샀다. 이 세 개의 선물은 직사각형 모양의 선물 상자에 각각 하나씩 담겨 있다.
프로도는 이 선물들을 적당한 크기의 직사각형 포장 상자에 넣어 포장하려 한다.
큰 포장 상자를 주문할수록 돈을 더 많이 써야 하기 때문에, 프로도는 최대한 작은 상자에 세 개의 선물을 모두 담으려고 한다.
(중략)
구매한 선물 상자들의 크기가 주어졌을 때, 선물들을 안전하게 포장하는 데 필요한 포장 상자의 최소 크기 (즉, 포장 상자의 넓이가 최소가 되는 경우)를 구하시오
https://www.acmicpc.net/problem/10881

 

10881번: 프로도의 선물 포장

프로도는 네오에게 줄 생일 선물을 세 개 샀다. 이 세 개의 선물은 직사각형 모양의 선물 상자에 각각 하나씩 담겨 있다. 프로도는 이 선물들을 적당한 크기의 직사각형 포장 상자에 넣어 포장하

www.acmicpc.net

 

과정


이전 문제에서도 풀어본 완전탐색 문제이다.
풀면서 느끼는 건데 확실히 완전탐색 문제는 생각하는 일련의 과정이 난해한 문제들이 많은 것 같다. 
(대부분 최대한 무식하게 생각해서 풀면 되긴 하는듯..)
 
선물상자가 배치될 수 있는 경우의 수는 하나 당 세운 것과 눕힌 것 '두 개' 의 경우가 될 것이다.

선물 상자의 개수는 다행히도 세개로 고정되어 있으므로 택할 수 있는 경우의 수는 63

연산의 최대치가 높지 않으므로 3중 반복문을 사용할 것이다.
 
상자 세개를 배치하는 방법은,, 잘 생각해보면
1. 세 상자를 모두 나란히 배치
2. 두 개의 상자 위에 하나의 상자를 배치
두 가지만 생각해줘도 모든 경우의 수를 생각 할 수 있다.
 
3중 반복문 안에서 서로 같은 상자를 배치하는 경우를 제외시키고, 서로 다른 상자일 경우
위의 두가지 경우를 계산해서 최솟값을 출력하면 문제가 해결된다.
 
자센한 사항은 주석을 달아놓았으니 참고하면 좋을 것 같다.
 
 

코드


#include <iostream>
using namespace std;

int height[7];
int width[7];

int calcu(){
    int answer=0;
    int ansheight;
    int answidth;
    for(int i = 1; i<=6; i++){
        for(int j = 1; j <=6; j++){
            for(int k = 1; k<=6; k++){
                //같은 상자가 들어가는 상황 제외..
                if(i%3 == j%3 || j%3 == k%3 || k%3 == i%3|| i==j || i==k || j==k){
                    continue;
                }
                //세개가 나란한 상황,, * i j k가 3이상 넘어가면 height와 width 반전되므로 상관x
                ansheight = height[i] + height[j] + height[k];
                answidth = max(max(width[i], width[j]), width[k]);

                if(answer == 0)
                    answer = ansheight*answidth;
                else{
                    answer = min(answer, ansheight*answidth);
                }

                //두 상자 위에 한개가 있는 경우
                //높이 = 위에 있는 상자 두 개 중에 높이 높은 상자 + 아래 있는 상자
                //가로 = 위에 있는 상자 두 개 더한 가로와 아래 있는 상자 중 더 긴 상자
                
                ansheight = height[i]+ max(height[j], height[k]);
                answidth = max(width[i],width[j]+ width[k]);
                answer = min(answer, ansheight*answidth);
            }
        }
    }
    return answer;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    int t;
    cin >> t;
    while(t--){
        for(int i = 1; i<=3; i++){
            cin >> width[i] >> height[i];
            width[i+3] = height[i];
            height[i+3] = width[i];
        }
        
        cout << calcu()<<'\n';
    }
}