PS/Java

[백준] 5373. 큐빙

siyamaki 2022. 9. 21. 11:09

루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.

 

큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.

 

이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.

 

루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.

위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.


입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.

  • 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
  • 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.

출력

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.


굉장한 노가다가 필요한 문제이며, 코드의 실수가 있을 때 디버깅이 매우 힘들었다.

 

큐브의 위치를 저장할 때 해당 큐브가 바라보는 면을 기준으로 초기화를 해 줘야 한다

 

큐브를 돌릴 면과 방향을 배열로 접근할 수 있게 int형 정수로 변환 한다.

if(r == 'U') { idx = 0; }
else if (r == 'F') { idx = 1; }
else if (r == 'D') { idx = 2; }
else if (r == 'B') { idx = 3; }
else if (r == 'L') { idx = 4; }
else if (r == 'R') { idx = 5; }
int dir = command.charAt(1) == '+' ? 0 : 1;

회전을 할 땐 돌리려는 면과 그 면과 인접한 부분들이 함께 돌아가야 한다.

면을 회전할 경우 인덱스가 어떻게 변하는지 기록해두고 tmp배열을 만들어 swap해준다.

    public static void rotateArr(int idx, int dir) {
        // 바라보는 방향 회전
        /*            시계        반시계
        00 01 02    20 10 00    02 12 22
        10 11 12 -> 21 11 01    01 11 21
        20 21 22    22 12 02    00 10 20
        */
        char[][] tmp = new char[3][3];
        if(dir == 0) {  // 시계
            tmp[0][0] = arr[idx][2][0]; tmp[0][1] = arr[idx][1][0]; tmp[0][2] = arr[idx][0][0];
            tmp[1][0] = arr[idx][2][1]; tmp[1][1] = arr[idx][1][1]; tmp[1][2] = arr[idx][0][1];
            tmp[2][0] = arr[idx][2][2]; tmp[2][1] = arr[idx][1][2]; tmp[2][2] = arr[idx][0][2];
        } else {    // 반시계
            tmp[0][0] = arr[idx][0][2]; tmp[0][1] = arr[idx][1][2]; tmp[0][2] = arr[idx][2][2];
            tmp[1][0] = arr[idx][0][1]; tmp[1][1] = arr[idx][1][1]; tmp[1][2] = arr[idx][2][1];
            tmp[2][0] = arr[idx][0][0]; tmp[2][1] = arr[idx][1][0]; tmp[2][2] = arr[idx][2][0];
        }
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                arr[idx][i][j] = tmp[i][j];
            }
        }
    }

그리고 인접한 배열들을 돌리기 위해 어떤 면을 돌릴때 해당 면과 인접한 면들이 돌아가는 조각들이 어떻게 대입되는지 접근할 배열을 하나 만들었다.

order[돌릴 면][방향][해당 면과 인접한 면들] 이다. 예를 들어 0번(윗방향 )을 돌리면 1, 4, 3, 5면이 각각 한칸씩 이동한다.

public static int[][][] order = {
    // U 0 / F 1 / D 2 / B 3 / L 4 / R 5
    {{1, 4, 3, 5}, {1, 5, 3, 4}},   // 0 윗면
    {{0, 5, 2, 4}, {0, 4, 2, 5}},   // 1 앞면
    {{1, 5, 3, 4}, {1, 4, 3, 5}},   // 2 밑면
    {{0, 4, 2, 5}, {0, 5, 2, 4}},   // 3 뒷면
    {{0, 1, 2, 3}, {0, 3, 2, 1}},   // 4 왼쪽
    {{0, 3, 2, 1}, {0, 1, 2, 3}}    // 5 오른쪽
};

그리고 인접한 면들이 돌아갈 때 어떤 좌표들이 움직이는지 저장할 surface배열을 만들었다.

 

surface[돌아갈 면][방향][회전순서][행][열] 순이며 주석에 써 놓은 것처럼

윗면을 +방향으로 돌리면(surface[0][0]) 1, 4, 3, 5 면들의 인접한 블록이 이동하니 1번 면에서 4번 면으로 갈 때, 4번 면에서 3번 면으로 갈 때의 좌표 이동값을 저장해두었다.

public static int[][][][][] surface = {
    {// idx
        {{{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}}, // 시계 dir
        {{{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}} // 반시계
        /*
        윗면(0) 시계 
        1[00 01 02]->4[00 01 02] 4[00 01 02]->3[00 01 02] 3[00 01 02]->5[00 01 02] 5[00 01 02]->1[00 01 02]
        윗면(0) 반시계
        1[00 01 02]->5[00 01 02] 5[00 01 02]->3[00 01 02] 3[00 01 02]->4[00 01 02] 4[00 01 02]->1[00 01 02]
        */
    },
    {
        {{{2,0}, {2,1}, {2,2}}, {{0,0}, {1,0}, {2,0}}, {{2,0}, {2,1}, {2,2}}, {{2,2}, {1,2}, {0,2}}}, // 시계
        {{{2,0}, {2,1}, {2,2}}, {{2,2}, {1,2}, {0,2}}, {{2,0}, {2,1}, {2,2}}, {{0,0}, {1,0}, {2,0}}} // 반시계
        /* 
        앞면(1) 시계 
        0[20 21 22]->5[00 10 20] 5[00 10 20]->2[20 21 22] 2[20 21 22]->4[22 12 02] 4[22 12 02]->0[20 21 22]
        앞면(1) 반시계
        0[20 21 22]->4[22 12 02] 4[22 12 02]->2[20 21 22] 2[20 21 22]->5[00 10 20] 5[00 10 20]->0[20 21 22]
        */
    },  
    {
        {{{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}}, // 시계
        {{{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}} // 반시계
        /* 
        밑면(2) 시계 
        1[20 21 22]->5[20 21 22] 5[20 21 22]->3[20 21 22] 3[20 21 22]->4[20 21 22] 4[20 21 22]->1[20 21 22]
        밑면(2) 반시계
        1[20 21 22]->4[20 21 22] 4[20 21 22]->3[20 21 22] 3[20 21 22]->5[20 21 22] 5[20 21 22]->1[20 21 22]
        */
    },  
    {
        {{{0,0}, {0,1}, {0,2}}, {{2,0}, {1,0}, {0,0}}, {{0,0}, {0,1}, {0,2}}, {{0,2}, {1,2}, {2,2}}}, // 시계
        {{{0,0}, {0,1}, {0,2}}, {{0,2}, {1,2}, {2,2}}, {{0,0}, {0,1}, {0,2}}, {{2,0}, {1,0}, {0,0}}} // 반시계
        /* 
        뒷면(3) 시계
        0[00 01 02]->4[20 10 00] 4[20 10 00]->2[00 01 02] 2[00 01 02]->5[02 12 22] 5[02 12 22]->0[00 01 02]
        뒷면(3) 반시계
        0[00 01 02]->5[02 12 22] 5[02 12 22]->2[00 01 02] 2[00 01 02]->4[20 10 00] 4[20 10 00]->0[00 01 02]
        */
    },
    {
        {{{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}}, // 시계
        {{{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}} // 반시계
        /* 
        왼쪽(4) 시계
        0[00 10 20]->1[00 10 20] 1[00 10 20]->2[22 12 02] 2[22 12 02]->3[22 12 02] 3[22 12 02]->0[00 10 20]
        왼쪽(4) 반시계
        0[00 10 20]->3[22 12 02] 3[22 12 02]->2[22 12 02] 2[22 12 02]->1[00 10 20] 1[00 10 20]->0[00 10 20]
        */
    },
    {
        {{{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}}, // 시계
        {{{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}} // 반시계
        /*
        오른쪽(5) 시계 
        0[22 12 02]->3[00 10 20] 3[00 10 20]->2[00 10 20] 2[00 10 20]->1[22 12 02] 1[22 12 02]->0[22 12 02]
        오른쪽(5) 반시계
        0[22 12 02]->1[22 12 02] 1[22 12 02]->2[00 10 20] 2[00 10 20]->3[00 10 20] 3[00 10 20]->0[22 12 02]
        */
    }
};

그리고 tmp배열에 아까 만들어둔 인덱스 배열들을 이용해서 회전시킨 값을 저장 후 arr에 swap하면 된다.

public static void rotateSurface(int idx, int dir) {
    char[][] tmp = new char[4][3];
    // U 0 / F 1 / D 2 / B 3 / L 4 / R 5
    //[면][방향][회전순서][행][열]
    tmp[0][0] = arr[order[idx][dir][0]][surface[idx][dir][0][0][0]][surface[idx][dir][0][0][1]];
    tmp[0][1] = arr[order[idx][dir][0]][surface[idx][dir][0][1][0]][surface[idx][dir][0][1][1]];
    tmp[0][2] = arr[order[idx][dir][0]][surface[idx][dir][0][2][0]][surface[idx][dir][0][2][1]];

    tmp[1][0] = arr[order[idx][dir][1]][surface[idx][dir][1][0][0]][surface[idx][dir][1][0][1]];
    tmp[1][1] = arr[order[idx][dir][1]][surface[idx][dir][1][1][0]][surface[idx][dir][1][1][1]];
    tmp[1][2] = arr[order[idx][dir][1]][surface[idx][dir][1][2][0]][surface[idx][dir][1][2][1]];

    tmp[2][0] = arr[order[idx][dir][2]][surface[idx][dir][2][0][0]][surface[idx][dir][2][0][1]];
    tmp[2][1] = arr[order[idx][dir][2]][surface[idx][dir][2][1][0]][surface[idx][dir][2][1][1]];
    tmp[2][2] = arr[order[idx][dir][2]][surface[idx][dir][2][2][0]][surface[idx][dir][2][2][1]];

    tmp[3][0] = arr[order[idx][dir][3]][surface[idx][dir][3][0][0]][surface[idx][dir][3][0][1]];
    tmp[3][1] = arr[order[idx][dir][3]][surface[idx][dir][3][1][0]][surface[idx][dir][3][1][1]];
    tmp[3][2] = arr[order[idx][dir][3]][surface[idx][dir][3][2][0]][surface[idx][dir][3][2][1]];

    // 다음 값 저장
    arr[order[idx][dir][0]][surface[idx][dir][0][0][0]][surface[idx][dir][0][0][1]] = tmp[3][0];
    arr[order[idx][dir][0]][surface[idx][dir][0][1][0]][surface[idx][dir][0][1][1]] = tmp[3][1];
    arr[order[idx][dir][0]][surface[idx][dir][0][2][0]][surface[idx][dir][0][2][1]] = tmp[3][2];

    arr[order[idx][dir][1]][surface[idx][dir][1][0][0]][surface[idx][dir][1][0][1]] = tmp[0][0];
    arr[order[idx][dir][1]][surface[idx][dir][1][1][0]][surface[idx][dir][1][1][1]] = tmp[0][1];
    arr[order[idx][dir][1]][surface[idx][dir][1][2][0]][surface[idx][dir][1][2][1]] = tmp[0][2];

    arr[order[idx][dir][2]][surface[idx][dir][2][0][0]][surface[idx][dir][2][0][1]] = tmp[1][0];
    arr[order[idx][dir][2]][surface[idx][dir][2][1][0]][surface[idx][dir][2][1][1]] = tmp[1][1];
    arr[order[idx][dir][2]][surface[idx][dir][2][2][0]][surface[idx][dir][2][2][1]] = tmp[1][2];

    arr[order[idx][dir][3]][surface[idx][dir][3][0][0]][surface[idx][dir][3][0][1]] = tmp[2][0];
    arr[order[idx][dir][3]][surface[idx][dir][3][1][0]][surface[idx][dir][3][1][1]] = tmp[2][1];
    arr[order[idx][dir][3]][surface[idx][dir][3][2][0]][surface[idx][dir][3][2][1]] = tmp[2][2];

}

윗방향을 시계방향으로 돌렸을 경우 1, 4, 3, 2가 한칸씩 밀리게되는데 이건 tmp[0], tmp[1], tmp[2], tmp[3]이되며 arr에 다시 대입할 땐 한칸씩 밀린 상태로 tmp[3] tmp[0] tmp[1] tmp[2]순으로 대입하면 된다.

 


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main5373 {
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static char[][][] arr;
    public static void main(String[] args) throws Exception {
        int T = Integer.parseInt(br.readLine());
        for(int tc = 0; tc < T; tc++) {
            initArr();
            int n = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            while(st.hasMoreTokens()) {
                String command = st.nextToken();
                char r = command.charAt(0);
                int idx = -1;
                if(r == 'U') { idx = 0; }
                else if (r == 'F') { idx = 1; }
                else if (r == 'D') { idx = 2; }
                else if (r == 'B') { idx = 3; }
                else if (r == 'L') { idx = 4; }
                else if (r == 'R') { idx = 5; }
                int dir = command.charAt(1) == '+' ? 0 : 1;
                rotate(idx, dir);
            }
            for(int i = 0; i < 3; i++) {
                for(int j = 0; j < 3; j++) {
                    bw.write(arr[0][i][j]);
                }
                bw.newLine();
            }
        }
        br.close();
        bw.flush();
        bw.close();
    }
    public static void initArr() {
        char[][][] cube = {
            {{'w','w','w'},    // 윗면 0
             {'w','w','w'}, 
             {'w','w','w'}},
            {{'r','r','r'},    // 앞면 1
             {'r','r','r'}, 
             {'r','r','r'}},
            {{'y','y','y'},    // 밑면 2
             {'y','y','y'}, 
             {'y','y','y'}},
            {{'o','o','o'},    // 뒷면 3
             {'o','o','o'}, 
             {'o','o','o'}},
            {{'g','g','g'},    // 왼쪽 4
             {'g','g','g'}, 
             {'g','g','g'}},
            {{'b','b','b'},    // 오른쪽 5
             {'b','b','b'}, 
             {'b','b','b'}}
        };
        arr = cube;
    }

    public static void rotate(int idx, int dir) {
        rotateArr(idx, dir);
        rotateSurface(idx, dir);
    }

    public static void rotateArr(int idx, int dir) {
        // 바라보는 방향 회전
        /*            시계        반시계
        00 01 02    20 10 00    02 12 22
        10 11 12 -> 21 11 01    01 11 21
        20 21 22    22 12 02    00 10 20
        */
        char[][] tmp = new char[3][3];
        if(dir == 0) {  // 시계
            tmp[0][0] = arr[idx][2][0];
            tmp[0][1] = arr[idx][1][0];
            tmp[0][2] = arr[idx][0][0];
            tmp[1][0] = arr[idx][2][1];
            tmp[1][1] = arr[idx][1][1];
            tmp[1][2] = arr[idx][0][1];
            tmp[2][0] = arr[idx][2][2];
            tmp[2][1] = arr[idx][1][2];
            tmp[2][2] = arr[idx][0][2];
        } else {    // 반시계
            tmp[0][0] = arr[idx][0][2];
            tmp[0][1] = arr[idx][1][2];
            tmp[0][2] = arr[idx][2][2];
            tmp[1][0] = arr[idx][0][1];
            tmp[1][1] = arr[idx][1][1];
            tmp[1][2] = arr[idx][2][1];
            tmp[2][0] = arr[idx][0][0];
            tmp[2][1] = arr[idx][1][0];
            tmp[2][2] = arr[idx][2][0];
        }
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                arr[idx][i][j] = tmp[i][j];
            }
        }
    }
    public static void rotateSurface(int idx, int dir) {
        char[][] tmp = new char[4][3];
        // U 0 / F 1 / D 2 / B 3 / L 4 / R 5
        //[면][방향][회전순서][행][열]
        tmp[0][0] = arr[order[idx][dir][0]][surface[idx][dir][0][0][0]][surface[idx][dir][0][0][1]];
        tmp[0][1] = arr[order[idx][dir][0]][surface[idx][dir][0][1][0]][surface[idx][dir][0][1][1]];
        tmp[0][2] = arr[order[idx][dir][0]][surface[idx][dir][0][2][0]][surface[idx][dir][0][2][1]];

        tmp[1][0] = arr[order[idx][dir][1]][surface[idx][dir][1][0][0]][surface[idx][dir][1][0][1]];
        tmp[1][1] = arr[order[idx][dir][1]][surface[idx][dir][1][1][0]][surface[idx][dir][1][1][1]];
        tmp[1][2] = arr[order[idx][dir][1]][surface[idx][dir][1][2][0]][surface[idx][dir][1][2][1]];

        tmp[2][0] = arr[order[idx][dir][2]][surface[idx][dir][2][0][0]][surface[idx][dir][2][0][1]];
        tmp[2][1] = arr[order[idx][dir][2]][surface[idx][dir][2][1][0]][surface[idx][dir][2][1][1]];
        tmp[2][2] = arr[order[idx][dir][2]][surface[idx][dir][2][2][0]][surface[idx][dir][2][2][1]];

        tmp[3][0] = arr[order[idx][dir][3]][surface[idx][dir][3][0][0]][surface[idx][dir][3][0][1]];
        tmp[3][1] = arr[order[idx][dir][3]][surface[idx][dir][3][1][0]][surface[idx][dir][3][1][1]];
        tmp[3][2] = arr[order[idx][dir][3]][surface[idx][dir][3][2][0]][surface[idx][dir][3][2][1]];

        // 다음 값 저장
        arr[order[idx][dir][0]][surface[idx][dir][0][0][0]][surface[idx][dir][0][0][1]] = tmp[3][0];
        arr[order[idx][dir][0]][surface[idx][dir][0][1][0]][surface[idx][dir][0][1][1]] = tmp[3][1];
        arr[order[idx][dir][0]][surface[idx][dir][0][2][0]][surface[idx][dir][0][2][1]] = tmp[3][2];

        arr[order[idx][dir][1]][surface[idx][dir][1][0][0]][surface[idx][dir][1][0][1]] = tmp[0][0];
        arr[order[idx][dir][1]][surface[idx][dir][1][1][0]][surface[idx][dir][1][1][1]] = tmp[0][1];
        arr[order[idx][dir][1]][surface[idx][dir][1][2][0]][surface[idx][dir][1][2][1]] = tmp[0][2];

        arr[order[idx][dir][2]][surface[idx][dir][2][0][0]][surface[idx][dir][2][0][1]] = tmp[1][0];
        arr[order[idx][dir][2]][surface[idx][dir][2][1][0]][surface[idx][dir][2][1][1]] = tmp[1][1];
        arr[order[idx][dir][2]][surface[idx][dir][2][2][0]][surface[idx][dir][2][2][1]] = tmp[1][2];

        arr[order[idx][dir][3]][surface[idx][dir][3][0][0]][surface[idx][dir][3][0][1]] = tmp[2][0];
        arr[order[idx][dir][3]][surface[idx][dir][3][1][0]][surface[idx][dir][3][1][1]] = tmp[2][1];
        arr[order[idx][dir][3]][surface[idx][dir][3][2][0]][surface[idx][dir][3][2][1]] = tmp[2][2];

    }
    public static int[][][] order = {
        {{1, 4, 3, 5}, 
         {1, 5, 3, 4}},   // 0 윗면
        {{0, 5, 2, 4}, 
         {0, 4, 2, 5}},   // 1 앞면
        {{1, 5, 3, 4}, 
         {1, 4, 3, 5}},   // 2 밑면
        {{0, 4, 2, 5}, 
         {0, 5, 2, 4}},   // 3 뒷면
        {{0, 1, 2, 3}, 
         {0, 3, 2, 1}},   // 4 왼쪽
        {{0, 3, 2, 1}, 
         {0, 1, 2, 3}}    // 5 오른쪽
    };
    public static int[][][][][] surface = {
        {// idx
            {{{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}}, // 시계 dir
            {{{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}, {{0,0}, {0,1}, {0,2}}} // 반시계
            /*
            윗면(0) 시계 
            1[00 01 02]->4[00 01 02] 4[00 01 02]->3[00 01 02] 3[00 01 02]->5[00 01 02] 5[00 01 02]->1[00 01 02]
            윗면(0) 반시계
            1[00 01 02]->5[00 01 02] 5[00 01 02]->3[00 01 02] 3[00 01 02]->4[00 01 02] 4[00 01 02]->1[00 01 02]
            */
        },
        {
            {{{2,0}, {2,1}, {2,2}}, {{0,0}, {1,0}, {2,0}}, {{2,0}, {2,1}, {2,2}}, {{2,2}, {1,2}, {0,2}}}, // 시계
            {{{2,0}, {2,1}, {2,2}}, {{2,2}, {1,2}, {0,2}}, {{2,0}, {2,1}, {2,2}}, {{0,0}, {1,0}, {2,0}}} // 반시계
            /* 
            앞면(1) 시계 
            0[20 21 22]->5[00 10 20] 5[00 10 20]->2[20 21 22] 2[20 21 22]->4[22 12 02] 4[22 12 02]->0[20 21 22]
            앞면(1) 반시계
            0[20 21 22]->4[22 12 02] 4[22 12 02]->2[20 21 22] 2[20 21 22]->5[00 10 20] 5[00 10 20]->0[20 21 22]
            */
        },  
        {
            {{{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}}, // 시계
            {{{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}, {{2,0}, {2,1}, {2,2}}} // 반시계
            /* 
            밑면(2) 시계 
            1[20 21 22]->5[20 21 22] 5[20 21 22]->3[20 21 22] 3[20 21 22]->4[20 21 22] 4[20 21 22]->1[20 21 22]
            밑면(2) 반시계
            1[20 21 22]->4[20 21 22] 4[20 21 22]->3[20 21 22] 3[20 21 22]->5[20 21 22] 5[20 21 22]->1[20 21 22]
            */
        },  
        {
            {{{0,0}, {0,1}, {0,2}}, {{2,0}, {1,0}, {0,0}}, {{0,0}, {0,1}, {0,2}}, {{0,2}, {1,2}, {2,2}}}, // 시계
            {{{0,0}, {0,1}, {0,2}}, {{0,2}, {1,2}, {2,2}}, {{0,0}, {0,1}, {0,2}}, {{2,0}, {1,0}, {0,0}}} // 반시계
            /* 
            뒷면(3) 시계
            0[00 01 02]->4[20 10 00] 4[20 10 00]->2[00 01 02] 2[00 01 02]->5[02 12 22] 5[02 12 22]->0[00 01 02]
            뒷면(3) 반시계
            0[00 01 02]->5[02 12 22] 5[02 12 22]->2[00 01 02] 2[00 01 02]->4[20 10 00] 4[20 10 00]->0[00 01 02]
            */
        },
        {
            {{{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}}, // 시계
            {{{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}} // 반시계
            /* 
            왼쪽(4) 시계
            0[00 10 20]->1[00 10 20] 1[00 10 20]->2[22 12 02] 2[22 12 02]->3[22 12 02] 3[22 12 02]->0[00 10 20]
            왼쪽(4) 반시계
            0[00 10 20]->3[22 12 02] 3[22 12 02]->2[22 12 02] 2[22 12 02]->1[00 10 20] 1[00 10 20]->0[00 10 20]
            */
        },
        {
            {{{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}, {{2,2}, {1,2}, {0,2}}}, // 시계
            {{{2,2}, {1,2}, {0,2}}, {{2,2}, {1,2}, {0,2}}, {{0,0}, {1,0}, {2,0}}, {{0,0}, {1,0}, {2,0}}} // 반시계
            /*
            오른쪽(5) 시계 
            0[22 12 02]->3[00 10 20] 3[00 10 20]->2[00 10 20] 2[00 10 20]->1[22 12 02] 1[22 12 02]->0[22 12 02]
            오른쪽(5) 반시계
            0[22 12 02]->1[22 12 02] 1[22 12 02]->2[00 10 20] 2[00 10 20]->3[00 10 20] 3[00 10 20]->0[22 12 02]
            */
        }
    };
}