백준 1041 주사위 (C++)

안유태·2023년 10월 26일
0

알고리즘

목록 보기
165/239

1041번: 주사위

그리디를 이용한 문제이다. 주사위의 면이 보이는 경우는 총 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;
}
profile
공부하는 개발자

0개의 댓글