백준/그리디
[백준] 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);