백준/그리디

[백준] C++ 1041번(주사위)

2zreal 2024. 7. 3. 20:03

 

#include <iostream>

using namespace std;

int arr[6];

int main(void)
{
	long long int a=0;
	long long int min1=1000;
	long long int min2=1000;
	long long int min3=1000;
	
	cin>>a;
	
	for(int i=0; i<6; i++)
	{
		cin>>arr[i];
		if(arr[i]<min1)
		{
			min1=arr[i];
		}
	}
	
	for(int i=0; i<6; i++)
	{
		for(int j=0; j<6; j++)
		{
			if(i!=j&&j!=5-i)
			{
				if(arr[i]+arr[j]<min2)
				{
					min2=arr[i]+arr[j];
				}
			}
		}
	}
	
	for(int i=0; i<6; i++)
	{
		for(int j=0; j<6; j++)
		{
			if(i!=j&&j!=5-i)
			{
				for(int l=0; l<6; l++)
				{
					if(l!=j&&l!=i&&l!=5-j&&l!=5-i)
					{
						if(min3>arr[i]+arr[j]+arr[l])
						{
							min3=arr[i]+arr[j]+arr[l];
						}
					}
				}
			}
		}
	}
	
	
	long long int result=((a-1)*(a-2)*min1)*4 + ((a-1)*4*min2) + ((a-2)*(a-2)*min1 + 4*(a-2)*min2 + 4*min3);
	
	int max=0;
	
	if(a==1)
	{
		result=0;
		for(int i=0; i<6; i++)
		{
			result+=arr[i];
			if(arr[i]>max)
			{
				max=arr[i];
			}
		}
		result=result-max;
	}
	
	cout<<result;
	
	return 0;
}

 

이 문제는 주사위를 이용해서 큰 주사위를 만드는데 바닥면을 제외한 보이는 5개의 면에 쓰여 있는 수의 합의 최솟값을 출력하는 문제이다.  

 

이 문제를 해결하기 위해서 어떤 주사위 면이 필요한지 알아야한다.

1.한면만 보이는 주사위

2.두면이 보이는 주사위

3.세면이 보이는 주사위

 

위에서 내려다봤다고 상상해 보자. 

위 그림의 숫자는 보이는 면의 개수를 의미한다.

이제 대충 옆면도 어떻게 되는지 상상이 갈 것이다.

이 주사위를 통해 

1.한면만 보이는 주사위

2.두면이 보이는 주사위

3.세면이 보이는 주사위

의 최솟값을 알아내야 한다.

 

최솟값을 알아내는 방법은 코드를 보고 생각해 보길 바란다.

위 3개의 답을 알아내면 문제는 거의 해결된다.

result=((a-1)*(a-2)*min1)*4 + ((a-1)*4*min2) + ((a-2)*(a-2)*min1 + 4*(a-2)*min2 + 4*min3);