[C++]BOJ 1041 - 주사위

[C++]BOJ 1041 - 주사위

우선 한 면이 바닥에 가려져 있으므로 총 5n^2만큼의 면을 볼 수 있다.
그 중 3면이 보이는 주사위는 윗쪽 꼭지점 4개, 2면이 보이는 주사위는 눈에 보이는 모서리 8개와 아랫쪽 꼭지점 4개, 1면이 보이는 주사위는 5n^2 - (3 * 3면이 보이는 주사위의 수) - (2 * 2면이 보이는 주사위의 수) 이다.
이를 식으로 나타내면,

3 면 == 4 개
2 면 == 8n - 12 개
1 면 == 5n^2 - 16n + 12 개

로 정리할 수 있다.

그리고 3면과 2면을 고를 때 단순히 주사위 면 중 숫자가 작은 면을 골라내면 문제가 발생하기 때문에 서로 이어진 면들을 선택해야 한다.

3면이 보이는 경우 == 마주보는 3쌍의 면들 중 각 쌍에서 작은 면을 고른다.
2면이 보이는 경우 == 마주보는 면을 제외하고 모든 경우의 합(12개)을 저장하고 가장 작은 값을 이용한다.

마지막으로 주사위가 하나일 경우 예외처리를 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
using namespace std;
long long n, d[6], v3, v[12], v2, cnt;
int main() {
cin >> n;
for(int i = 0; i < 6; i++)
cin >> d[i];
v3 = min(d[0], d[5]) + min(d[2], d[3]) + min(d[1], d[4]);
for(int i = 0; i < 6; i++)
for(int j = i + 1; j < 6; j++) {
if((i==0&&j==5)||(i==2&&j==3)||(i==1&&j==4)) continue;
v[cnt++] = d[i] + d[j];
}
sort(v, v + 12);
sort(d, d + 6);
v2 = v[0];
if(n == 1) {
cout << d[0] + d[1] + d[2] + d[3] + d[4];
return 0;
}
cout << v3 * 4 + v2 * (8 * n - 12) + d[0] * (5 * (n * n) - 16 * n + 12);
}