본문 바로가기
Problem Solving/BOJ

백준 1041번 주사위 - C++(cpp) 풀이

by 어멘드 2022. 4. 4.
반응형

 

1. 3면이 노출되는 주사위는 4개, 2면이 노출되는 주사위는 (8*N-12) 개, 나머지는 1면만 노출되는 주사위이다.
2. 노출되는 면의 숫자 합이 최소가 되도록 한다.
3. N=1인 경우 예외 처리를 해준다.

 

1. 3면이 노출되는 주사위는 4개, 2면이 노출되는 주사위는 (8*N-12) 개,나머지는 1면만 노출되는 주사위이다.

 윗면의 네 꼭짓점에 위치한 주사위는 세 면이 노출된다. 그리고 8개의 모서리에서 꼭짓점을 제외한 곳에 위치한 주사위들은 총 두 면이 노출된다. 나머지 주사위들은 한 면만 노출된다.

 

2. 노출되는 면의 숫자 합이 최소가 되도록 한다.

먼저 3면이 노출되는 주사위부터 생각해보자. 노출되는 3면의 종류는 꼭짓점의 개수와 같으므로 8가지이다. (AED, ABD, ACE, ABC, FED, FBD, FCE, FBC) 이 중 세 숫자의 합이 최소가 되는 경우를 택하면 된다. 2면이 노출되는 경우는 모서리의 개수와 같으므로 12가지(AE, AD, AB, AC, FE, FD, FB, FC, ED, EC, CB, BD)이고, 같은 방법으로 합이 최소가 되는 경우를 택하면 된다. 한 면만 노출되는 경우는 당연히 최솟값을 가지는 면을 택하면 된다.

 

3. N=1인 경우 예외 처리를 해준다.

 단, 위에서 설명한 것은 N이 2 이상일 때만 적용된다. N=1일 때는 최댓값을 가지는 면이 바닥으로 가도록 예외처리를 해준다.

반응형

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef long long ll;

ll N, A, B, C, D, E, F;

ll three_face() {
    vector<ll> arr =
    { A+E+D, A+B+D, A+C+E, A+B+C,
      F+E+D, F+B+D, F+C+E, F+B+C
    };
    
    return *min_element(arr.begin(), arr.end()) * 4;
}

ll two_face() {
    vector<ll> arr =
    { A+E, A+D, A+B, A+C,
      F+E, F+D, F+B, F+C,
      E+D, E+C, C+B, B+D
    };
    
    return *min_element(arr.begin(), arr.end()) * (8*N-12);
}

ll one_face() {
    vector<ll> arr = {A, B, C, D, E, F};
    
    return *min_element(arr.begin(), arr.end()) * ((N-2)*(N-2) + 4*(N*N-N-2*(N-1)));
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> N >> A >> B >> C >> D >> E >> F;
    if (N == 1) {
        vector<ll> arr = {A, B, C, D, E, F};
        cout << A+B+C+D+E+F - *max_element(arr.begin(), arr.end());
    }
    else {
        cout << three_face() + two_face() + one_face();   
    }

    return 0;
}

 

반응형

댓글