Koala - 14기/코딩테스트 준비 스터디

[백준 2116 cpp] 주사위 쌓기

code_with_coffee 2024. 3. 17. 14:54

문제 분석

입력의 형태는 주사위의 전개도 값을 주어진다. 이때 주사위의 값의 패턴이 없기 때문에 주사위가 쌓일 때 바닥과 천장의 값을 직접 찾아야 하고 같은 이유로 측면에 놓이는 값들을 구해야한다. 

한 쪽 측면에 놓이는 값들의 합중에서 가장 큰 수를 원하기 때문에 한개의 주사위의 옆면에 해당하는 값들중 가장 큰 수만 선정하면 된다. 즉 주사위를 쌓는 경우에 대해서 찾으면 값은 알 수 있게 된다는 의미이다.

 

#include <iostream>
#include <algorithm>

using namespace std;

// 아래면의 인덱스를 윗면으로 단순히 바꿔줌
int top_val(int index) {
    if (index == 0) return 5;
    if (index == 1) return 3;
    if (index == 2) return 4;
    if (index == 3) return 1;
    if (index == 4) return 2;
    if (index == 5) return 0;
    return 0;
}

int main() {
    int N;
    int map[10000][6];
    cin >> N;
    for (int i = 0; i < N; i++) {
        for (int s = 0; s < 6; s++) {
            cin >> map[i][s];
        }
    }
    int ans = 0;

    for (int a = 0; a < 6; a++) {
        int temp_ans = 0;
        int index = a;
        int max_val = 0;
        for (int i = 0; i < N - 1; i++) {
            max_val = 0;

            index = top_val(index);
            for (int s = 0; s < 6; s++) {
                if (map[i + 1][s] == map[i][index]) {
                    for (int x = 0; x < 6; x++) {
                        if (x == index || x == top_val(index)) { continue; }
                        else max_val = max(max_val, map[i][x]);
                    }
                    index = s;
                    break;
                }
            }

            temp_ans += max_val;
        }
        max_val = 0;
        index = top_val(index);
        for (int x = 0; x < 6; x++) {
            if (x == index || x == top_val(index)) { continue; }
            else max_val = max(max_val, map[N - 1][x]);
        }
        temp_ans += max_val;
        ans = max(temp_ans, ans);
    }
    cout << ans;
    return 0;
}