큐빙 5373

PublicMinsu·2023년 8월 17일
0

문제

접근 방법

3차원 공간이다.
보는 관점에 따라 좌표의 값이 다르다는 점을 생각하면서 풀어야 한다.

윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색

위의 순서대로 0부터 5까지를 부여했다.
0일 때 3, 4, 5, 2와 맞닿는 가장 가까운 좌표를 0,0 0,1 0,2로 설정하고 작성했다.
각 면에 각도는 다 다르기에 맞닿는 면에 가장 가까운 좌표도 다 다르다. 그러한 점을 정말 유심히 생각하면서 풀어줘야 한다.

규칙이 존재하는지는 모르겠다. 어쩔 수 없이 하드코딩을 하기로 결심하고 풀었다. 어차피 구현 문제니까 요구한 바만 잘 따라주면 된다.

코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;
char cube[6][3][3], temp[3][3], tempLine[3];
void init()
{
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
        {
            cube[0][i][j] = 'w';
            cube[1][i][j] = 'y';
            cube[2][i][j] = 'r';
            cube[3][i][j] = 'o';
            cube[4][i][j] = 'g';
            cube[5][i][j] = 'b';
        }
}
void roll(string &cmd)
{
    char face = cmd[0];
    int target;
    if (face == 'U')
    {
        target = 0;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][0][1], tempLine[2] = cube[5][0][2];
            cube[5][0][0] = cube[3][0][0], cube[5][0][1] = cube[3][0][1], cube[5][0][2] = cube[3][0][2];
            cube[3][0][0] = cube[4][0][0], cube[3][0][1] = cube[4][0][1], cube[3][0][2] = cube[4][0][2];
            cube[4][0][0] = cube[2][0][0], cube[4][0][1] = cube[2][0][1], cube[4][0][2] = cube[2][0][2];
            cube[2][0][0] = tempLine[0], cube[2][0][1] = tempLine[1], cube[2][0][2] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][0][1], tempLine[2] = cube[5][0][2];
            cube[5][0][0] = cube[2][0][0], cube[5][0][1] = cube[2][0][1], cube[5][0][2] = cube[2][0][2];
            cube[2][0][0] = cube[4][0][0], cube[2][0][1] = cube[4][0][1], cube[2][0][2] = cube[4][0][2];
            cube[4][0][0] = cube[3][0][0], cube[4][0][1] = cube[3][0][1], cube[4][0][2] = cube[3][0][2];
            cube[3][0][0] = tempLine[0], cube[3][0][1] = tempLine[1], cube[3][0][2] = tempLine[2];
        }
    }
    else if (face == 'D')
    {
        target = 1;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[5][2][0], tempLine[1] = cube[5][2][1], tempLine[2] = cube[5][2][2];
            cube[5][2][0] = cube[2][2][0], cube[5][2][1] = cube[2][2][1], cube[5][2][2] = cube[2][2][2];
            cube[2][2][0] = cube[4][2][0], cube[2][2][1] = cube[4][2][1], cube[2][2][2] = cube[4][2][2];
            cube[4][2][0] = cube[3][2][0], cube[4][2][1] = cube[3][2][1], cube[4][2][2] = cube[3][2][2];
            cube[3][2][0] = tempLine[0], cube[3][2][1] = tempLine[1], cube[3][2][2] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[5][2][0], tempLine[1] = cube[5][2][1], tempLine[2] = cube[5][2][2];
            cube[5][2][0] = cube[3][2][0], cube[5][2][1] = cube[3][2][1], cube[5][2][2] = cube[3][2][2];
            cube[3][2][0] = cube[4][2][0], cube[3][2][1] = cube[4][2][1], cube[3][2][2] = cube[4][2][2];
            cube[4][2][0] = cube[2][2][0], cube[4][2][1] = cube[2][2][1], cube[4][2][2] = cube[2][2][2];
            cube[2][2][0] = tempLine[0], cube[2][2][1] = tempLine[1], cube[2][2][2] = tempLine[2];
        }
    }
    else if (face == 'F')
    {
        target = 2;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][1][0], tempLine[2] = cube[5][2][0];
            cube[5][0][0] = cube[0][2][0], cube[5][1][0] = cube[0][2][1], cube[5][2][0] = cube[0][2][2];
            cube[0][2][0] = cube[4][2][2], cube[0][2][1] = cube[4][1][2], cube[0][2][2] = cube[4][0][2];
            cube[4][2][2] = cube[1][0][2], cube[4][1][2] = cube[1][0][1], cube[4][0][2] = cube[1][0][0];
            cube[1][0][2] = tempLine[0], cube[1][0][1] = tempLine[1], cube[1][0][0] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][1][0], tempLine[2] = cube[5][2][0];
            cube[5][0][0] = cube[1][0][2], cube[5][1][0] = cube[1][0][1], cube[5][2][0] = cube[1][0][0];
            cube[1][0][2] = cube[4][2][2], cube[1][0][1] = cube[4][1][2], cube[1][0][0] = cube[4][0][2];
            cube[4][2][2] = cube[0][2][0], cube[4][1][2] = cube[0][2][1], cube[4][0][2] = cube[0][2][2];
            cube[0][2][0] = tempLine[0], cube[0][2][1] = tempLine[1], cube[0][2][2] = tempLine[2];
        }
    }
    else if (face == 'B')
    {
        target = 3;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[5][2][2], tempLine[1] = cube[5][1][2], tempLine[2] = cube[5][0][2];
            cube[5][2][2] = cube[1][2][0], cube[5][1][2] = cube[1][2][1], cube[5][0][2] = cube[1][2][2];
            cube[1][2][0] = cube[4][0][0], cube[1][2][1] = cube[4][1][0], cube[1][2][2] = cube[4][2][0];
            cube[4][0][0] = cube[0][0][2], cube[4][1][0] = cube[0][0][1], cube[4][2][0] = cube[0][0][0];
            cube[0][0][2] = tempLine[0], cube[0][0][1] = tempLine[1], cube[0][0][0] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[5][2][2], tempLine[1] = cube[5][1][2], tempLine[2] = cube[5][0][2];
            cube[5][2][2] = cube[0][0][2], cube[5][1][2] = cube[0][0][1], cube[5][0][2] = cube[0][0][0];
            cube[0][0][2] = cube[4][0][0], cube[0][0][1] = cube[4][1][0], cube[0][0][0] = cube[4][2][0];
            cube[4][0][0] = cube[1][2][0], cube[4][1][0] = cube[1][2][1], cube[4][2][0] = cube[1][2][2];
            cube[1][2][0] = tempLine[0], cube[1][2][1] = tempLine[1], cube[1][2][2] = tempLine[2];
        }
    }
    else if (face == 'L')
    {
        target = 4;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[0][0][0], tempLine[1] = cube[0][1][0], tempLine[2] = cube[0][2][0];
            cube[0][0][0] = cube[3][2][2], cube[0][1][0] = cube[3][1][2], cube[0][2][0] = cube[3][0][2];
            cube[3][2][2] = cube[1][0][0], cube[3][1][2] = cube[1][1][0], cube[3][0][2] = cube[1][2][0];
            cube[1][0][0] = cube[2][0][0], cube[1][1][0] = cube[2][1][0], cube[1][2][0] = cube[2][2][0];
            cube[2][0][0] = tempLine[0], cube[2][1][0] = tempLine[1], cube[2][2][0] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[0][0][0], tempLine[1] = cube[0][1][0], tempLine[2] = cube[0][2][0];
            cube[0][0][0] = cube[2][0][0], cube[0][1][0] = cube[2][1][0], cube[0][2][0] = cube[2][2][0];
            cube[2][0][0] = cube[1][0][0], cube[2][1][0] = cube[1][1][0], cube[2][2][0] = cube[1][2][0];
            cube[1][0][0] = cube[3][2][2], cube[1][1][0] = cube[3][1][2], cube[1][2][0] = cube[3][0][2];
            cube[3][2][2] = tempLine[0], cube[3][1][2] = tempLine[1], cube[3][0][2] = tempLine[2];
        }
    }
    else
    {
        target = 5;
        if (cmd[1] == '+')
        {
            tempLine[0] = cube[0][2][2], tempLine[1] = cube[0][1][2], tempLine[2] = cube[0][0][2];
            cube[0][2][2] = cube[2][2][2], cube[0][1][2] = cube[2][1][2], cube[0][0][2] = cube[2][0][2];
            cube[2][2][2] = cube[1][2][2], cube[2][1][2] = cube[1][1][2], cube[2][0][2] = cube[1][0][2];
            cube[1][2][2] = cube[3][0][0], cube[1][1][2] = cube[3][1][0], cube[1][0][2] = cube[3][2][0];
            cube[3][0][0] = tempLine[0], cube[3][1][0] = tempLine[1], cube[3][2][0] = tempLine[2];
        }
        else
        {
            tempLine[0] = cube[0][2][2], tempLine[1] = cube[0][1][2], tempLine[2] = cube[0][0][2];
            cube[0][2][2] = cube[3][0][0], cube[0][1][2] = cube[3][1][0], cube[0][0][2] = cube[3][2][0];
            cube[3][0][0] = cube[1][2][2], cube[3][1][0] = cube[1][1][2], cube[3][2][0] = cube[1][0][2];
            cube[1][2][2] = cube[2][2][2], cube[1][1][2] = cube[2][1][2], cube[1][0][2] = cube[2][0][2];
            cube[2][2][2] = tempLine[0], cube[2][1][2] = tempLine[1], cube[2][0][2] = tempLine[2];
        }
    }
    if (cmd[1] == '+')
        for (int i = 0; i < 3; ++i)
            for (int j = 0; j < 3; ++j)
                temp[j][3 - 1 - i] = cube[target][i][j];
    else
        for (int i = 0; i < 3; ++i)
            for (int j = 0; j < 3; ++j)
                temp[3 - 1 - j][i] = cube[target][i][j];
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            cube[target][i][j] = temp[i][j];
}
int main()
{
    vector<string> v;
    string cmd;
    ios::sync_with_stdio(0), cin.tie(0);
    int tc, n;
    cin >> tc;
    while (tc--)
    {
        init();
        v.clear();
        cin >> n;
        while (n--)
        {
            cin >> cmd;
            v.push_back(cmd);
        }
        for (int i = 0; i < v.size(); ++i)
        {
            if (i + 3 < v.size() && (v[i] == v[i + 1]) && (v[i + 1] == v[i + 2]) && (v[i + 2] == v[i + 3]))
            {
                i = i + 3;
                continue;
            }
            else if (i + 1 < v.size() && v[i][0] == v[i + 1][0] && v[i][1] != v[i + 1][1])
            {
                i = i + 1;
                continue;
            }
            roll(v[i]);
        }
        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
                cout << cube[0][i][j];
            cout << "\n";
        }
    }
    return 0;
}

풀이


앞면을 작성할 때 자꾸 실수하는 느낌이 들어서 그냥 유니티로 대강 만들어서 해결했다.
이렇게 모형을 만들어서 하는데도 가끔 실수로 잘못 적으려 한 걸 보면 꽤 헷갈리는 문제다.
시험장에서 비슷한 문제가 나온다면 종이를 잘라서 큐브를 만들 것 같다.

추가로 같은 면에 대해서 같은 방향으로 회전을 4번 연속하거나 방향을 번갈아서 회전하는 경우는 무시해 주는 방식으로 구현해야 시간 초과가 나오지 않는다.

profile
연락 : publicminsu@naver.com

0개의 댓글