문제풀이/백준

2116 - 주사위 쌓기

동바리 2023. 6. 1. 08:58

문제 :

2116번: 주사위 쌓기 (acmicpc.net)

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net

#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX_SQUARE_MAX_CNT (10000 + 1)
#define dice_kind_cnt      (6 + 1)
vector<uint32_t>         square_vec[MAX_SQUARE_MAX_CNT];
uint32_t                 square_cnt;
uint32_t                 max_ans                         = 0;
uint32_t                 maxNum_arry[MAX_SQUARE_MAX_CNT] = {0};
uint32_t                 compatible[6 + 1]               = {0};

void Run(const uint32_t under_num, const uint32_t curr_layer,
              uint32_t sum) {
    if (curr_layer > square_cnt) {
        if (max_ans < sum) {
            max_ans = sum;
        }

        return;
    }

    uint32_t upper_num     = 0;
    for (int i = 1; i <= 6; i++) {
        if (square_vec[curr_layer][i] == under_num) {
            upper_num = square_vec[curr_layer][compatible[i]];
            break;
        }
    }

    int nowmax = 6;
    while (true) { // 지금 행에서 옆면최대값 찾는 과정
        if (nowmax != upper_num && nowmax != under_num)
            break;
        else
            nowmax--;
    }

    Run(upper_num, curr_layer + 1,
        sum + nowmax);
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> square_cnt;
    for (size_t i = 1; i <= square_cnt; ++i) {
        square_vec[i].resize(7);
        for (uint32_t j = 1; j <= 6; j++) {
            uint32_t temp;
            cin >> square_vec[i][j];
        }
    }

    compatible[1] = 6, compatible[6] = 1;
    compatible[2] = 4, compatible[4] = 2;
    compatible[3] = 5, compatible[5] = 3;

    // 어느면이 윗면인지 고려되있지 않음.
    for (size_t i = 1; i <= 6; i++) {
        Run(square_vec[1][i], 1, 0);
    }

	cout << max_ans << '\n';

    return 0;
}

초등학생 수준의 문제라니.... 예제는 맞았지만, 정답은 아니었어서 아래 링크의 코드를 참고했습니다. 제 아이디어와 동일했지만, 제 코드는 답이 아니었어서... ㅜ

백준2116-주사위쌓기 java (tistory.com)

문제를 정확히 이해하지 못해, 처음엔 아예 틀린 방법으로 접근했었네요. 그래서 정답이 계속 30이 나왔었지만, 힌트를 보고 그게 아닌것을 알았습니다.

아랫면의 숫자와 매칭되는 숫자가 다음 층의 주사위의 아랫면이 된다는 것을 유념하시면 됩니다.