그리디를 이용한 문제이다. 주사위의 면이 보이는 경우는 총 3가지가 된다. 1면만 보이는 경우, 2면만 보이는 경우 그리고 3면이 보이는 경우이다. 주사위로 이루어진 정사면체를 바닥에 두었다고 생각해보자. 그러면 1면만 보이는 경우에 해당하는 주사위 수는 가장 윗면에 (N - 2) * (N - 2)
개가 될 것이고 사이드로 (N - 1) * (N - 2) * 4
개가 될 것이다. 2면만 보이는 경우는 윗면에 (N - 2) * 4
개, 사이드에 (N - 1) * 4
개가 될 것이고, 3면이 보이는 경우는 모서리의 개수인 4개가 될 것이다. 각 경우의 최솟값을 구해 갯수와 곱한 후 더해주어 값을 구해주고 출력해주었다. 로직을 떠올리는 데에 시간이 오래 걸렸지만 구현까지는 금방 할 수 있었다. 단순하게 접근하는게 좋을 수도 있다는 점을 인지해두자.
#include <iostream>
#include <algorithm>
using namespace std;
long long N, result;
int A[6];
long long a, b, c;
long long step1() {
long long val = min(min(a, b), c);
return val * ((N - 1) * (N - 2) * 4 + (N - 2) * (N - 2));
}
long long step2() {
long long val = min(min(a + b, b + c), c + a);
return val * ((N - 1) * 4 + (N - 2) * 4);
}
long long step3() {
long long val = a + b + c;
return val * 4;
}
void solution() {
if (N == 1) {
sort(A, A + 6);
for (int i = 0; i < 5; i++) {
result += A[i];
}
}
else {
a = min(A[0], A[5]);
b = min(A[1], A[4]);
c = min(A[2], A[3]);
result = step1() + step2() + step3();
}
cout << result;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for (int i = 0; i < 6; i++) {
cin >> A[i];
}
solution();
return 0;
}