반응형

문제 링크

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

 

 

풀이 )

  주사위의 6면을 각각 배열로 나타낸 다음 주어진 순서대로 큐브를 돌린다.

  3차원 배열로 나타내면 헷갈릴까봐 6개의 2차원 배열로 나타냈다.

  

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void rotate(vector<vector<int>>& face, int dir){
    int tmp = face[0][0];
    if(dir == 1){   // 시계
        int tmp2 = face[1][0];
        face[0][0] = face[2][0];
        face[1][0] = face[2][1];
        face[2][0] = face[2][2];
        face[2][1] = face[1][2];
        face[2][2] = face[0][2];
        face[1][2] = face[0][1];
        face[0][2] = tmp;
        face[0][1] = tmp2;
    }
    else{   // 반시계
        int tmp2 = face[0][1];
        face[0][0] = face[0][2];
        face[0][1] = face[1][2];
        face[0][2] = face[2][2];
        face[1][2] = face[2][1];
        face[2][2] = face[2][0];
        face[2][1] = face[1][0];
        face[2][0] = tmp;
        face[1][0] = tmp2;
    }
}

int main(void){
    char color[] = {'w', 'r', 'g', 'b', 'o', 'y'};
    int t;
    cin >> t;
    while(t--){
        vector<vector<int>> u(3, vector<int>(3, 0));
        vector<vector<int>> f(3, vector<int>(3, 1));
        vector<vector<int>> l(3, vector<int>(3, 2));
        vector<vector<int>> r(3, vector<int>(3, 3));
        vector<vector<int>> b(3, vector<int>(3, 4));
        vector<vector<int>> d(3, vector<int>(3, 5));
        int n;
        cin >> n;
        while(n--){
            string str;
            cin >> str;
            if(str == "L-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[i][0];
                    f[i][0] = d[i][0];
                    d[i][0] = b[i][0];
                    b[i][0] = u[i][0];
                    u[i][0] = tmp;
                }
                rotate(l, 0);
            }
            else if(str == "L+"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[i][0];
                    f[i][0] = u[i][0];
                    u[i][0] = b[i][0];
                    b[i][0] = d[i][0];
                    d[i][0] = tmp;
                }
                rotate(l, 1);
            }
            else if(str == "R-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[i][2];
                    f[i][2] = u[i][2];
                    u[i][2] = b[i][2];
                    b[i][2] = d[i][2];
                    d[i][2] = tmp;
                }
                rotate(r, 0);
            }
            else if(str == "R+"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[i][2];
                    f[i][2] = d[i][2];
                    d[i][2] = b[i][2];
                    b[i][2] = u[i][2];
                    u[i][2] = tmp;
                }
                rotate(r, 1);
            }
            else if(str == "F-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = u[2][i];
                    u[2][i] = r[2][i];
                    r[2][i] = d[0][2-i];
                    d[0][2-i] = l[2][i];
                    l[2][i] = tmp;
                }
                rotate(f, 0);
            }
            else if(str == "F+"){
                for(int i = 0; i < 3; ++i){
                    int tmp = u[2][i];
                    u[2][i] = l[2][i];
                    l[2][i] = d[0][2-i];
                    d[0][2-i] = r[2][i];
                    r[2][i] = tmp;
                }
                rotate(f, 1);
            }
            else if(str == "B-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = u[0][i];
                    u[0][i] = l[0][i];
                    l[0][i] = d[2][2-i];
                    d[2][2-i] = r[0][i];
                    r[0][i] = tmp;
                }
                rotate(b, 0);
            }
            else if(str == "B+"){
                for(int i = 0; i < 3; ++i){
                    int tmp = u[0][i];
                    u[0][i] = r[0][i];
                    r[0][i] = d[2][2-i];
                    d[2][2-i] = l[0][i];
                    l[0][i] = tmp;
                }
                rotate(b, 1);
            }
            else if(str == "U-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[0][i];
                    f[0][i] = l[i][2];
                    l[i][2] = b[2][2-i];
                    b[2][2-i] = r[2-i][0];
                    r[2-i][0] = tmp;
                }
                rotate(u, 0);
            }
            else if(str == "U+"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[0][i];
                    f[0][i] = r[2-i][0];
                    r[2-i][0] = b[2][2-i];
                    b[2][2-i] = l[i][2];
                    l[i][2] = tmp;
                }
                rotate(u, 1);
            }
            else if(str == "D-"){
                for(int i = 0; i < 3; ++i){
                    int tmp = f[2][i];
                    f[2][i] = r[2-i][2];
                    r[2-i][2] = b[0][2-i];
                    b[0][2-i] = l[i][0];
                    l[i][0] = tmp;
                }
                rotate(d, 0);
            }
            else{
                for(int i = 0; i < 3; ++i){
                    int tmp = f[2][i];
                    f[2][i] = l[i][0];
                    l[i][0] = b[0][2-i];
                    b[0][2-i] = r[2-i][2];
                    r[2-i][2] = tmp;
                }
                rotate(d, 1);
            }
        }

        for(int i = 0; i < 3; ++i){
            for(int j = 0; j < 3; ++j)
                cout << color[u[i][j]];
            cout << '\n';
        }
    }
}

 

주의 )

  회전할 때 각 면의 좌표를 잘 확인해야한다. 각 면의 기준 좌표에 따라 표현하는 방식이 달라지기 때문에 기준을 명확히 정하고, 빈 종이에 전개도를 그리면 실수가 준다.

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 4375 : 1  (0) 2020.12.12
[C++] 백준 - 1748 : 수 이어 쓰기 1  (0) 2020.12.12
[C++] 백준 - 14502 : 연구소  (0) 2020.12.09
[C++] 백준 - 9663 : N-Queen  (0) 2020.12.09
[C++] 백준 - 1065 : 한수  (0) 2020.12.07

+ Recent posts