알고리즘/알고리즘문풀

BOJ - 큐빙 5373번 (JAVA)

developer-ellen 2022. 4. 22. 03:15

❓ 문제 - 백준 큐빙 5373번 - JAVA 풀이법

출처 

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

 

5373번: 큐빙

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

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다. (아주 빡구현 ^^..ㅎ)

  • 각 면 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면에 색깔 값을 2차원배열로 관리하며 돌린다.
  • 돌리라는 면과 방향(시계 or 반시계)에 맞춰 함수를 돌려준다. -> 영향받는 다른 면들 상태 변경
  • 그리고 해당면을 방향(시계 or 반시계)에 맞춰 90도 돌리는 함수도 돌려준다.
  • 각 면에 맞는 2차원 배열을 관리 할 때 바라보는 방향에 맞춰 열과 행을 관리할 수 있도록 한다.
  • 밑에 각 면에 파란 부분은 해당 면을 돌리면 영향받는 부분을 표시한 것이다.

 

 

2. 돌리는 함수

 1) 윗면 돌리기

  • 시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다.
  • 반시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다. 

 2) 바닥면 돌리기

  • 시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다.
  • 반시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다. 

 3) 앞면 돌리기

  • 시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다. 

 4) 뒷면 돌리기

  • 시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다. 

 5) 왼쪽면 돌리기

  • 시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다. 

 6) 오른쪽면 돌리기

  • 시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다.
  • 반시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다. 

 

3. 느낀점

  • 4시간 이상은 걸린 .. ㅎㅎ 
  • 제발 ! 자바 값 복사할 때 clone 쓰거나 그대로 값 넣어주자...
  • 자바는... 얕은 복사의 경우 조심하자...........

 

💻 소스코드

// BOJ - 큐빙(5373번)
// 구현

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_5373 {

	public static char[][] up;
	public static char[][] down;
	public static char[][] front;
	public static char[][] back;
	public static char[][] left;
	public static char[][] right;
	
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		for(int test_case=1;test_case<=TC;test_case++) {
			int n = Integer.parseInt(br.readLine());
			String[] data = br.readLine().split(" ");
			up = new char[][]{{'w', 'w', 'w'}, {'w', 'w', 'w'}, {'w', 'w', 'w'}};
			down = new char[][]{{'y', 'y', 'y'}, {'y', 'y', 'y'}, {'y', 'y', 'y'}};
			front = new char[][]{{'r', 'r', 'r'}, {'r', 'r', 'r'}, {'r', 'r', 'r'}};
			back = new char[][]{{'o', 'o', 'o'}, {'o', 'o', 'o'}, {'o', 'o', 'o'}};
			left = new char[][]{{'g', 'g', 'g'}, {'g', 'g', 'g'}, {'g', 'g', 'g'}};
			right = new char[][]{{'b', 'b', 'b'}, {'b', 'b', 'b'}, {'b', 'b', 'b'}};
			
			for(int i=0;i<n;i++) {
				String str = data[i];
				char move = str.charAt(0);
				char dir = str.charAt(1);
				if(move == 'U') {
					rotate_U(dir);
				} else if(move == 'D') {
					rotate_D(dir);
				} else if(move == 'F') {
					rotate_F(dir);
				} else if(move == 'B') {
					rotate_B(dir);
				} else if(move == 'L') {
					rotate_L(dir);
				} else if(move == 'R') {
					rotate_R(dir);
				}
				
				
			}
					
			for(int i=0;i<3;i++) {
				for(int j=0;j<3;j++) {
					sb.append(up[i][j]);
				}
				sb.append("\n");
			}
		}
		System.out.println(sb.toString());
	}
	
	public static void rotate_U(char dir) {
		
		if(dir == '+') {
			up = rotate1(up);
			char[] temp = back[0];
			back[0] = left[0];
			left[0] = front[0];
			front[0] = right[0];
			right[0] = temp;

			// 뒷 - 오 - 앞 - 왼 - 뒷
			
		} else {

			up = rotate2(up);
			// 뒷 - 왼 - 앞 - 오 - 뒷 
			char[] temp = back[0].clone();
			back[0] = right[0].clone();
			right[0] = front[0].clone();
			front[0] = left[0].clone();
			left[0] = temp;
		}
	}
	
	public static void rotate_D(char dir) {
		if(dir == '+') {
			down = rotate1(down);
			// 뒷 - 왼 - 앞 - 오 - 뒷 
			char[] temp = back[2].clone();
			back[2] = right[2].clone();
			right[2] = front[2].clone();
			front[2] = left[2].clone();
			left[2] = temp;
		} else {
			down = rotate2(down);
			// 뒷 - 오 - 앞 - 왼 - 뒷
			char[] temp = back[2].clone();
			back[2] = left[2].clone();
			left[2] = front[2].clone();
			front[2] = right[2].clone();
			right[2] = temp;
		}
	}
	
	public static void rotate_F(char dir) {
		if(dir == '+') {
			front = rotate1(front);
			// 윗 - 오 - 바 - 왼 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2][i];
			}
			
			for(int i=0;i<3;i++) {
				up[2][i] = left[2-i][2];
			}

			for(int i=0;i<3;i++) {
				left[i][2] = down[2][2-i];
			}
			
			for(int i=0;i<3;i++) {
				down[2][i] = right[i][0];
			}
			
			for(int i=0;i<3;i++) {
				right[i][0] = temp[i];
			}
			
			
			
		} else {
			front = rotate2(front);
			// 윗 - 왼 - 바 - 오 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2][2-i];
			}
	
			for(int i=0;i<3;i++) {
				up[2][i] = right[i][0];
			}

			for(int i=0;i<3;i++) {
				right[i][0] = down[2][i];
			}
			

			for(int i=0;i<3;i++) {
				down[2][i] = left[2-i][2];
			}

			for(int i=0;i<3;i++) {
				left[i][2] = temp[i];
			}
			
		}
	}
	
	public static void rotate_B(char dir) {
		if(dir == '+') {
			back = rotate1(back);
			// 윗 - 왼 - 바 - 오 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[0][2-i];
			}
			for(int i=0;i<3;i++) {
				up[0][i] = right[i][2];
			}
			for(int i=0;i<3;i++) {
				right[i][2] = down[0][i];
			}
			for(int i=0;i<3;i++) {
				down[0][i] = left[2-i][0];
			}
			for(int i=0;i<3;i++) {
				left[i][0] = temp[i];
			}
			
		} else {
			back = rotate2(back);
			// 윗 - 오 - 바 - 왼 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[0][i];
			}

			for(int i=0;i<3;i++) {
				up[0][i] = left[2-i][0];
			}
			for(int i=0;i<3;i++) {
				left[i][0] = down[0][2-i];
			}
			for(int i=0;i<3;i++) {
				down[0][i] = right[i][2];
			}
			for(int i=0;i<3;i++) {
				right[i][2] = temp[i];
			}
		}
	}
	
	public static void rotate_L(char dir) {
		if(dir == '+') {
			left = rotate1(left);
			// 윗 - 앞 - 바 - 뒷 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[i][0];
			}
			for(int i=0;i<3;i++) {
				up[i][0] = back[2-i][2];
			}
			for(int i=0;i<3;i++) {
				back[i][2] = down[i][2];
			}
			for(int i=0;i<3;i++) {
				down[i][2] = front[2-i][0];
			}
			for(int i=0;i<3;i++) {
				front[i][0] = temp[i];
			}
		} else {
			left = rotate2(left);
			// 윗 - 뒷 - 바 - 앞  - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2-i][0];
			}
			for(int i=0;i<3;i++) {
				up[i][0] = front[i][0];
			}
			for(int i=0;i<3;i++) {
				front[i][0] = down[2-i][2];
			}
			for(int i=0;i<3;i++) {
				down[i][2] = back[i][2];
			}
			for(int i=0;i<3;i++) {
				back[i][2] = temp[i];
			}
		}
	}
	
	public static void rotate_R(char dir) {
		if(dir == '+') {
			right = rotate1(right);
			// 윗 - 뒷 - 바 - 앞  - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[2-i][2];
			}
			for(int i=0;i<3;i++) {
				up[i][2] = front[i][2];
			}
			for(int i=0;i<3;i++) {
				front[i][2] = down[2-i][0];
			}
			for(int i=0;i<3;i++) {
				down[i][0] = back[i][0];
			}
			for(int i=0;i<3;i++) {
				back[i][0] = temp[i];
			}
		} else {
			right = rotate2(right);
			// 윗 - 앞 - 바 - 뒷 - 윗
			char[] temp = new char[3];
			for(int i=0;i<3;i++) {
				temp[i] = up[i][2];
			}
			for(int i=0;i<3;i++) {
				up[i][2] = back[2-i][0];
			}
			for(int i=0;i<3;i++) {
				back[i][0] = down[i][0];
			}
			for(int i=0;i<3;i++) {
				down[i][0] = front[2-i][2];
			}
			for(int i=0;i<3;i++) {
				front[i][2] = temp[i];
			}
		}
	}
	
	// 시계방향으로 90도 회전
	public static char[][] rotate1(char[][] arr) {
		char[][] rotate = new char[3][3];
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				rotate[i][j] = arr[3-1-j][i];
			}
		}
		
		return rotate;
	}
	
	// 반시계 방향으로 90도 회전
	public static char[][] rotate2(char[][] arr) {
		char[][] rotate = new char[3][3];
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				rotate[i][j] = arr[j][3-1-i];
			}
		}
		
		return rotate;
	}
	



}