본문 바로가기
알고리즘/백준

[백준/C,C++] 1041번: 주사위

by 이민훈 2021. 4. 20.

www.acmicpc.net/problem/1041

 

1041번: 주사위

첫째 줄에 N이 주어진다. 둘째 줄에 주사위에 쓰여 있는 수가 주어진다. 위의 그림에서 A, B, C, D, E, F에 쓰여 있는 수가 차례대로 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, 쓰여 있는 수

www.acmicpc.net

풀이

 

n이 4인 경우를 보겠습니다.

 

4×4×4 크기의 정육면체입니다.

 

빨간색 부분은 3면이 보이는 주사위이고, 파란색 부분은 2면, 초록색 부분은 단 1면만 보입니다.

 

빨간색 부분은 정육면체의 크기에 상관없이 항상 4개 존재하고,

 

파란색 부분은 제일 꼭대기에 4 * (n - 2) → 8개와 그 밑으로 4 * (n - 1) → 12개가 존재합니다.

 

초록색 부분은 제일 꼭대기에 (n - 2) * (n - 2) → 4개와 그 밑으로 4 * (n - 2) * (n - 1) → 24개가 존재합니다.

 

 

유의해야 할 점이 있는데 해당 정육면체에서 자신과 마주 보는 면은 보일 수 없습니다.

 

최대 3면만 보이기 때문에 마주 보는 3면은 가려져 있습니다.

 

n이 1일 경우는 예외인데, 아랫면을 제외한 5면이 보입니다.

 

#include<iostream>
#include<algorithm>

using namespace std;

using LL = long long;

int main(void)
{
    LL n; cin >> n;
    int dice[6];

    for (int i = 0; i < 6; i++) {
        cin >> dice[i];
    }

    if (n == 1) {
        LL res = 0;

        sort(dice, dice + 6);
        for (int i = 0; i < 5; i++) {
            res += dice[i];
        }

        cout << res;
    }
    else {
        LL v[3];
        v[0] = min(dice[0], dice[5]);
        v[1] = min(dice[1], dice[4]);
        v[2] = min(dice[2], dice[3]);
        sort(v, v + 3);

        LL one = v[0];
        LL two = one + v[1];
        LL three = two + v[2];

        LL res = 0;
        res += three * 4;
        res += (two * 4 * (n - 1)) + (two * 4 * (n - 2));
        res += (one * 4 * (n - 2) * (n - 1)) + (one * (n - 2) * (n - 2));

        cout << res;
    }

    return 0;
}

반례

Input

5

1 1 1 1 1 1

Output

125

 

Input

10

50 39 25 14 48 7

Output

4132

 

Input

1000000

1 2 3 4 5 6

Output

5000008000000

댓글