본문 바로가기
Problem Solving/BOJ

[백준] 5373번 - 큐빙

by 테리는당근을좋아해 2020. 3. 16.

문제 >

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

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

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

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

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

 

입력 >

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

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

 

출력 >

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

 

해결방법 > 

시뮬레이션 문제다. 큐브를 [6][3][3] 배열에 담아서 각 입력에 따른 동작을 수행하는 프로그램을 만드는건데...

 

진짜 어렵다는 것보다 힘들었던 문제였다..

 

입력에 따라 큐브의 한 면이 돌아가고 이 때, 인접한 네 면의 한 줄이 시계방향 또는 반 시계방향으로 넘어간다.

 

자세한 동작 방식은 아래와 같다.

 

 

 

여기까지 구현하면 되는 줄 알았는데 가장 중요한 부분을 잊고 있었다.

 

큐브를 돌린 면의 행과 열이 시계방향 또는 반시계 방향으로 바뀐다는 점이다.

 

이 점을 빠뜨린지도 모른채 배열의 인덱스를 잘 못 넣었나 몇 시간을 찾았다....

 

머리때문에 몸이 고생했다.

 

[JAVA]

package baekjoon;

import java.util.*;
import java.io.*;

public class BOJ_5373 {
	static char[][][] cube = new char[6][3][3];
	
	public static void init() {
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++) {
				cube[0][i][j] = 'w';
				cube[1][i][j] = 'r';
				cube[2][i][j] = 'y';
				cube[3][i][j] = 'o';
				cube[4][i][j] = 'g';
				cube[5][i][j] = 'b';
			}
		}
	}
	
	public static char[][] set(char[][] face, char d) {
		char[][] nface = new char[3][3];
		if(d == '+') {
			for(int i = 0; i < 3; i++) {
				for(int j = 0; j < 3; j++) {
					nface[j][2-i] = face[i][j];
				}
			}
		}
		else {
			for(int i = 0; i < 3; i++) {
				for(int j = 0; j < 3; j++) {
					nface[2-j][i] = face[i][j];
				}
			}
		}
		return nface;
	}
	
	public static void turn(String s) {
		char op = s.charAt(0);
		char d = s.charAt(1);
		if(op == 'U') {
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[4][i][2];
					cube[4][i][2] = cube[1][0][i];
					cube[1][0][i] = cube[5][2-i][0];
					cube[5][2-i][0] = cube[3][2][2-i];
					cube[3][2][2-i] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[3][2][2-i];
					cube[3][2][2-i] = cube[5][2-i][0];
					cube[5][2-i][0] = cube[1][0][i];
					cube[1][0][i] = cube[4][i][2];
					cube[4][i][2] = tmp;
				}
			}
			cube[0] = set(cube[0], d);
		}
		else if(op == 'D'){
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[4][2-i][0];
					cube[4][2-i][0] = cube[3][0][i];
					cube[3][0][i] = cube[5][i][2];
					cube[5][i][2] = cube[1][2][2-i];
					cube[1][2][2-i] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[1][2][2-i];
					cube[1][2][2-i] = cube[5][i][2];
					cube[5][i][2] = cube[3][0][i];
					cube[3][0][i] = cube[4][2-i][0];
					cube[4][2-i][0] = tmp;
				}
			}
			cube[2] = set(cube[2], d);
		}
		else if(op == 'F') {
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[4][2][2-i];
					cube[4][2][2-i] = cube[2][0][i];
					cube[2][0][i] = cube[5][2][2-i];
					cube[5][2][2-i] = cube[0][2][2-i];
					cube[0][2][2-i] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[0][2][2-i];
					cube[0][2][2-i] = cube[5][2][2-i];
					cube[5][2][2-i] = cube[2][0][i];
					cube[2][0][i] = cube[4][2][2-i];
					cube[4][2][2-i] = tmp;
				}
			}
			cube[1] = set(cube[1], d);
		}
		else if(op == 'B') {
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[4][0][i];
					cube[4][0][i] = cube[0][0][i];
					cube[0][0][i] = cube[5][0][i];
					cube[5][0][i] = cube[2][2][2-i];
					cube[2][2][2-i] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[2][2][2-i];
					cube[2][2][2-i] = cube[5][0][i];
					cube[5][0][i] = cube[0][0][i];
					cube[0][0][i] = cube[4][0][i];
					cube[4][0][i] = tmp;
				}
			}
			cube[3] = set(cube[3], d);
		}
		else if(op == 'L') {
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[2][2-i][0];
					cube[2][2-i][0] = cube[1][2-i][0];
					cube[1][2-i][0] = cube[0][2-i][0];
					cube[0][2-i][0] = cube[3][2-i][0];
					cube[3][2-i][0] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[3][2-i][0];
					cube[3][2-i][0] = cube[0][2-i][0];
					cube[0][2-i][0] = cube[1][2-i][0];
					cube[1][2-i][0] = cube[2][2-i][0];
					cube[2][2-i][0] = tmp;
				}
			}
			cube[4] = set(cube[4], d);
		}
		else {
			if(d == '+') {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[0][i][2];
					cube[0][i][2] = cube[1][i][2];
					cube[1][i][2] = cube[2][i][2];
					cube[2][i][2] = cube[3][i][2];
					cube[3][i][2] = tmp;
				}
			}
			else {
				for(int i = 0; i < 3; i++) {
					char tmp = cube[3][i][2];
					cube[3][i][2] = cube[2][i][2];
					cube[2][i][2] = cube[1][i][2];
					cube[1][i][2] = cube[0][i][2];
					cube[0][i][2] = tmp;
				}
			}
			cube[5] = set(cube[5], d);
		}
	}
	
	public static void print() {
		for(int i = 0; i < 3; i++) {
			for(int j = 0; j < 3; j++) {
				System.out.print(cube[0][i][j]);
			}
			System.out.println();
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer tk = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(tk.nextToken());
		for(int i = 0; i < n; i++) {
			tk = new StringTokenizer(br.readLine());
			int m = Integer.parseInt(tk.nextToken());
			tk = new StringTokenizer(br.readLine());
			init();
			for(int j = 0; j < m; j++) {
				String s = tk.nextToken();
				turn(s);
			}
			print();
		}
		
	}
}

'Problem Solving > BOJ' 카테고리의 다른 글

[백준] 3190번 - 뱀  (0) 2020.03.18
[백준] 17822번 - 원판 돌리기  (0) 2020.03.18
[백준] 14500번 - 테트로미노  (0) 2020.03.16
[백준] 16234번 - 인구 이동  (0) 2020.03.16
[백준] 14499번 - 주사위 굴리기  (0) 2020.03.16

댓글