본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 5373 큐빙

by 까망 하르방 2021. 2. 22.
반응형

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

 Input 

4

1

L-

2

F+ B+

4

U- D- L+ R+

10

L- U- L+ U- L- U- U- L+ U+ U+

 

 Output 

rww
rww
rww
bbb
www
ggg
gwg
owr
bwb
gwo
www
rww

정육면체(6) * 시계/반시계 방향(2) = 12가지 회전이 존재합니다.

※ [반시계 방향 이동 1번 = 시계 방향 이동 3번] 특성을 이용할 수도 있습니다.

     ex) F+: 앞면을 시계 방향으로 한 번 회전 = F- 앞면을 시계 방향으로 3번 회전

 

처음 전개도는 다음과 같습니다.

 

F+(앞 면을 시계방향으로 회전) 실행 후, 전개도는 아래와 같습니다.

 

차이점은 아래와 같습니다.

회전하는 면의 9개와 인접한 면의 12개까지 총 21개가 변화. 

 

※ 회전할 때 바라보는 면

18 - 19 - 20 - 23 - 26 - 25 - 24 - 21

 24 - 21 - 18 - 19 - 20 - 23 - 26 - 25

 

 인접한 면

6  7  8  / 44  41  38 / 11  10  9  /  45  48  51

▶ 44  41  38  /  11  10  9  /  45  48  51  /  6  7  8 


import java.io.*;
import java.util.StringTokenizer;
 
class Main {
    static final int U = 0, D = 1, F = 2, B = 3, L = 4, R = 5;
    static char[][][] cube;
    static BufferedReader br;
    static BufferedWriter bw;
    
    public static void main(String[] args) throws IOException{
    	br = new BufferedReader(new  InputStreamReader(System.in));
        bw = new BufferedWriter(new  OutputStreamWriter(System.out));

        char[] colors = {'w','y','r','o','g','b'};
        
        int T = Integer.parseInt(br.readLine());
        
        while(T-- > 0) {
        	// 큐브 초기화
        	init(colors);
        	
        	int N = Integer.parseInt(br.readLine());
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	while(N-- > 0) {
        		String rotateInfo = st.nextToken();
        		// 방향 확인
        		boolean clk = rotateInfo.charAt(1) == '+';
            	switch (rotateInfo.charAt(0)) {
	        		case 'U': rotate(U, L, F, R, B, clk); break;
	        		case 'D': rotate(D, B, R, F, L, clk); break;
	        		case 'F': rotate(F, U, L, D, R, clk); break;
	        		case 'B': rotate(B, R, D, L, U, clk); break;
	        		case 'L': rotate(L, F, U, B, D, clk); break;
	        		case 'R': rotate(R, D, B, U, F, clk); break;
            	}
        	}
        	// 정답 출력
        	printAnswer();
        }
        bw.flush(); bw.close();
    }
    
	private static void rotate(int f, int u, int l, int d, int r, boolean clk) {
		char[][] temp = new char[3][3];
		char[] temp2 = new char[3];
		
		// 시계방향은 1번, 반시계 방향은 3번
		if(clk) {
			for (int i=0; i<3; ++i)
				for (int j=0; j<3; ++j) {
					temp[i][j] = cube[f][2-j][i];
				}
			for (int i=0; i<3; ++i) temp2[i] = cube[u][i][0];
			for (int i=0; i<3; ++i) cube[u][i][0] = cube[l][0][2-i];
			for (int i=0; i<3; ++i) cube[l][0][2-i] = cube[d][2][i];
			for (int i=0; i<3; ++i) cube[d][2][i] = cube[r][2-i][2];
			for (int i=0; i<3; ++i) cube[r][2-i][2] = temp2[i];
		}

        else {
            for (int i=0; i<3; ++i)
                for (int j=0; j<3; ++j) {
                    temp[i][j] = cube[f][j][2-i];
                }
            for (int i=0; i<3; ++i) temp2[i] = cube[u][i][0];
            for (int i=0; i<3; ++i) cube[u][i][0] = cube[r][2-i][2];
            for (int i=0; i<3; ++i) cube[r][2-i][2] = cube[d][2][i];
            for (int i=0; i<3; ++i) cube[d][2][i] = cube[l][0][2-i];
            for (int i=0; i<3; ++i) cube[l][0][2-i] = temp2[i];
        }
		
		cube[f] = temp;
	}

	private static void printAnswer() throws IOException{
    	for (int i=0; i<3; ++i) {
			for (int j=0; j<3; ++j) {
				bw.write(cube[0][j][2-i]);
			}
        	bw.write("\n");
        }
	}

	private static void init(char[] colors) {
        int n = colors.length;
        cube = new char[n][][];
        
        for (int i=0; i<n; ++i) {
            cube[i] = new char[3][3];
            for (int j=0; j<3; ++j){
            	for (int k=0; k<3; ++k) {
            		cube[i][j][k] = colors[i];
            	}
            }
        }
    }  
}

반응형

댓글