ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 5373번 : 큐빙 - 자바(JAVA)
    알고리즘/백준 2022. 5. 19. 00:01
    728x90

    https://www.acmicpc.net/problem/5373

     

    5373번: 큐빙

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

    www.acmicpc.net

     

     

    문제 해석

    큐브는 3 x 3 x 3개의 작은 정육면체로 이루어져 있습니다.

    퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 합니다.

    큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있습니다.

     

    이 문제에서는 큐브가 모두 풀린 상태에서 시작합니다.

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

    큐브를 돌리는 방법이 순서대로 주어지고, 모두 돌린 후 가장 윗면의 색상을 구하는 프로그램을 작성하세요.

     

    문제 풀이 전 설계

    일반적인 큐브와 같이 이해할 수 있습니다.

    특별한 생각보다는 모든면에 대해서 한번의 큐브 회전이 일어났을때 상태를 기록하며 마지막에 윗면을 출력하면 될 것 같습니다.

     

    어떤 면을 기준으로 큐브를 돌리는 일이 발생하면

    1. 어떤 면에서는 큐브가 돌아가는 방향에 맞춰서 가운데를 제외한 부분들이 회전해야 합니다.

    2. 어떤 면의 반대편을 제외한 인접한 면들은 모두 영향을 받습니다.

    3. 인접한 면들은 시계,반시계 방향에 따라서 가장 윗부분의 3부분이 회전됩니다.

     

    따라서 어떤 면으로 접근하더라도 큐브를 돌리는 방식은 비슷하기 때문에 함수화하여 풀이합니다.

     

    위의 그림처럼 영향을 받는다고 이해하면 됩니다.

     

     

    코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main_5373_큐빙 {
    
        static char[][][] cube;
        static final int UP = 0, DOWN = 1, FRONT = 2, BACK = 3,LEFT = 4, RIGHT = 5;
        static char[] initColor = {'w','y','r','o','g','b'};
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int TC = Integer.parseInt(br.readLine());
    
    
           StringTokenizer st = null;
            //테스트케이스만큼 반복
            for (int i = 0; i < TC; i++) {
                //큐브생성
    
                cube = initNewCube(initColor);
    
                int rotateCount = Integer.parseInt(br.readLine());
                st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < rotateCount; j++) {
                    String temp = st.nextToken();
                    char targetPlane = temp.charAt(0);
                    char rotateDirection = temp.charAt(1);
                    rotate(targetPlane, rotateDirection);
                }
                printUpside();
            }
        }
    
        private static void printUpside() {
            for(int i=0; i<3; i++){
                for(int j=0; j<3; j++){
                    System.out.print(cube[UP][j][2-i]);
                }
                System.out.println();
            }
        }
    
        private static char[][][] initNewCube(char[] colors) {
            int num = colors.length;
            char[][][] tempCube = new  char[num][3][3];
    
            for(int i=0; i<num; i++){
                for(int j=0; j<3; j++){
                    for(int k=0; k<3; k++){
                        tempCube[i][j][k] = colors[i];
                    }
                }
            }
            return tempCube;
    
        }
    
        private static void rotate(char targetPlane, char rotateDirection) {
            switch (targetPlane){
                //어떤면을 돌린다. 어떤면의 반대편을 제외하고 모두 영향을 받음.
                case 'U':
                    alter(UP,LEFT,FRONT,RIGHT,BACK,rotateDirection);
                    break;
                case 'D':
                    alter(DOWN,BACK,RIGHT,FRONT,LEFT,rotateDirection);
                    break;
                case 'F':
                    alter(FRONT,UP,LEFT,DOWN,RIGHT,rotateDirection);
                    break;
                case 'B':
                    alter(BACK,RIGHT,DOWN,LEFT,UP,rotateDirection);
                    break;
                case 'L':
                    alter(LEFT,FRONT,UP,BACK,DOWN,rotateDirection);
                    break;
                case 'R':
                    alter(RIGHT,DOWN,BACK,UP,FRONT,rotateDirection);
                    break;
                default:
                    break;
    
            }
        }
    
        private static void alter(int front, int up, int left, int down, int right, char rotateDirection) {
            //해당면과 옆면이 돌아가는것이 다름
    
            char[][] upSideTemp = new char[3][3];
            char[] sideTemp = new char[3];
    
            if (rotateDirection == '+') {
                for (int i=0; i<3; ++i)
                    for (int j=0; j<3; ++j) {
                        upSideTemp[i][j] = cube[front][2-j][i];
                    }
                for (int i=0; i<3; ++i)
                    sideTemp[i] = cube[up][i][0];
                for (int i=0; i<3; ++i)
                    cube[up][i][0] = cube[left][0][2-i];
                for (int i=0; i<3; ++i)
                    cube[left][0][2-i] = cube[down][2][i];
                for (int i=0; i<3; ++i)
                    cube[down][2][i] = cube[right][2-i][2];
                for (int i=0; i<3; ++i)
                    cube[right][2-i][2] = sideTemp[i];
            }
            else {
                for (int i=0; i<3; ++i)
                    for (int j=0; j<3; ++j) {
                        upSideTemp[i][j] = cube[front][j][2-i];
                    }
                for (int i=0; i<3; ++i)
                    sideTemp[i] = cube[up][i][0];
                for (int i=0; i<3; ++i)
                    cube[up][i][0] = cube[right][2-i][2];
                for (int i=0; i<3; ++i)
                    cube[right][2-i][2] = cube[down][2][i];
                for (int i=0; i<3; ++i)
                    cube[down][2][i] = cube[left][0][2-i];
                for (int i=0; i<3; ++i)
                    cube[left][0][2-i] = sideTemp[i];
            }
            cube[front] = upSideTemp;
    
        }
    }

     

     

    댓글

Designed by Tistory.