본문 바로가기
Computer Science/Algorithm

[백준] 2116 - 주사위 쌓기(C++)

by 수제햄버거 2020. 12. 28.
728x90
반응형

문제 출처 :

www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

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

www.acmicpc.net

문제 풀이 :

  • python 풀이와 같은 방식으로 풀었다.
  • 다만 C++의 경우 vector가 아무리 편하더라도 idx를 찾고 값을 지워주고 하는 등의 코딩이 무척 C++스럽다고 생각되었다.(사실 아직 C++ 스럽다는게 어떤느낌인지 잘 모른다)
  • C++로 코딩을 한지 얼마 안되어서 아직은 너무 낯설게 느껴져서 더 많이 헤멘 듯 하다.
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

void vector_2d_print(vector <vector<int>> vec)
{
    cout << "\n";
    for (int i = 0; i < vec.size(); i++)
    {
        for (int j = 0; j < vec[i].size(); j++)
        {
            cout << vec[i][j] << " ";
        }
        cout << "\n";
    }
}


void vector_1d_print(vector <int> vec)
{
    cout << "\n";
    for (int i = 0; i < vec.size(); i++)
    {

        cout << vec[i] << " ";
    }
    cout << "\n";
}


int main()
{
    int max_num = 0;
    int dice_num = 0;
    vector <vector<int>> dices;

    cin >> dice_num;
    int tmp = 0;

    for (int i = 0; i < dice_num; i++)
    {
        vector <int> temp = {};
        for (int j = 0; j < 6; j++)
        {
            cin >> tmp;
            temp.push_back(tmp);
        }
        dices.push_back(temp);
    }

    map<int, int> down_up_plane;
    down_up_plane[0] = 5;
    down_up_plane[1] = 3;
    down_up_plane[2] = 4;
    down_up_plane[3] = 1;
    down_up_plane[4] = 2;
    down_up_plane[5] = 0;

    int condition = false;

    for (int i = 0; i < 6; i++)
    {
        //첫번째 주사위 의 밑면 = i
        vector <int> tmp = { 1,2,3,4,5,6 };
        int res = 0;

        tmp.erase(std::remove(tmp.begin(), tmp.end(), dices[0][i]), tmp.end());
        tmp.erase(std::remove(tmp.begin(), tmp.end(), dices[0][down_up_plane[i]]), tmp.end());
        res += *max_element(tmp.begin(), tmp.end());

        std::vector<int>::iterator it = std::find(dices[1].begin(), dices[1].end(), dices[0][down_up_plane[i]]);
        int next_down_idx = std::distance(dices[1].begin(), it);

        for (int j = 1; j < dice_num; j++)
        {
            vector <int> tmp = { 1,2,3,4,5,6 };
            tmp.erase(std::remove(tmp.begin(), tmp.end(), dices[j][next_down_idx]), tmp.end());
            tmp.erase(std::remove(tmp.begin(), tmp.end(), dices[j][down_up_plane[next_down_idx]]), tmp.end());
            res += *max_element(tmp.begin(), tmp.end());

            if (j < dice_num - 1)
            {
                std::vector<int>::iterator it = std::find(dices[j + 1].begin(), dices[j + 1].end(), dices[j][down_up_plane[next_down_idx]]);
                next_down_idx = std::distance(dices[j + 1].begin(), it);
            }
        }
        if (res >= max_num)
        {
            max_num = res;
        }
    }
    cout << max_num << endl;
    return 0;
}
반응형