본문 바로가기
알고리즘/BOJ(백준)

[ 백준-5373번 / 시뮬레이션 ] 큐빙 (삼성 SW)

by 뎁꼼 2020. 3. 27.

1. 문제


큐빙 성공

한국어   

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 128 MB 5267 1840 1265 35.504%

문제

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

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

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

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

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

입력

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

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

출력

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

예제 입력 1 복사

4 1 L- 2 F+ B+ 4 U- D- L+ R+ 10 L- U- L+ U- L- U- U- L+ U+ U+

예제 출력 1 복사

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

 

 

 

 

2. 소스코드


- 하드코딩 필수. 어느정도 하드코딩인가는 개인의 역량.

- 바닥면의 방향이 정확히 정의되어 있지 않아 햇갈렸던 문제.

- 바닥면은 뒤집어서 반대로 생각해야 하는게 핵심.

- 예상 시간 복잡도 : O(TN)

입력 : T (<=100), N(<=1000)

큐브연산 : O(kN)  (k는 상수) 

 

 

#pragma warning (disable : 4996)
#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

/* cube */
char white_U[3][3];
char orange_B[3][3];
char green_L[3][3];
char blue_R[3][3];
char red_F[3][3];
char yellow_D[3][3];
/* //cube */

int T,n;
char cmd_Demesion, cmd_dir;

void iniCube() {
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			white_U[i][j] = 'w';
			orange_B[i][j] = 'o';
			green_L[i][j] = 'g';
			blue_R[i][j] = 'b';
			red_F[i][j] = 'r';
			yellow_D[i][j] = 'y';
		}
	}
}

void simulation(char cmd_Demesion, char cmd_dir) {


	switch (cmd_Demesion)
	{
	case 'L': 
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[i][0];
				white_U[i][0] = red_F[i][0];//
				red_F[i][0] = yellow_D[2-i][2];
				yellow_D[2-i][2] = orange_B[2-i][2];				 
				orange_B[2-i][2] = temp[i][0];
			} 
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = green_L[i][j];
				}
			}
			memcpy(green_L, temp, sizeof(green_L));
		}
		else {  
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[i][0];
				white_U[i][0] = orange_B[2 - i][2];
				orange_B[2-i][2] = yellow_D[2-i][2];
				yellow_D[2-i][2] = red_F[i][0];
				red_F[i][0] = temp[i][0];	 
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = green_L[i][j];
				}
			}
			memcpy(green_L, temp, sizeof(green_L));
		}
		break;

	case 'R':
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[i][2];
				white_U[i][2] = orange_B[2 - i][0];
				orange_B[2 - i][0] = yellow_D[2 - i][0];
				yellow_D[2 - i][0] = red_F[i][2];
				red_F[i][2] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = blue_R[i][j];
				}
			}
			memcpy(blue_R, temp, sizeof(blue_R));
		}
		else {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[i][2];
				white_U[i][2] = red_F[i][2];//
				red_F[i][2] = yellow_D[2 - i][0];
				yellow_D[2 - i][0] = orange_B[2 - i][0];
				orange_B[2 - i][0] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = blue_R[i][j];
				}
			}
			memcpy(blue_R, temp, sizeof(blue_R));
		}
		break;

	case 'F':
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[2][i];
				white_U[2][i] = blue_R[i][0];
				blue_R[i][0] = yellow_D[2][i];
				yellow_D[2][i] = green_L[2 - i][2];
				green_L[2 - i][2] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = red_F[i][j];
				}
			}
			memcpy(red_F, temp, sizeof(red_F));
		}
		else {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[2][i];
				white_U[2][i] = green_L[2 - i][2];
				green_L[2 - i][2] = yellow_D[2][i];
				yellow_D[2][i] = blue_R[i][0];
				blue_R[i][0] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = red_F[i][j];
				}
			}
			memcpy(red_F, temp, sizeof(red_F));
		}
		break;

	case 'B':
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[0][i];
				white_U[0][i] = green_L[2 - i][0];
				green_L[2 - i][0] = yellow_D[0][i];
				yellow_D[0][i] = blue_R[i][2];
				blue_R[i][2] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = orange_B[i][j];
				}
			}
			memcpy(orange_B, temp, sizeof(orange_B));
		}
		else {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = white_U[0][i];
				white_U[0][i] = blue_R[i][2];
				blue_R[i][2] = yellow_D[0][i];
				yellow_D[0][i] = green_L[2 - i][0];
				green_L[2 - i][0] = temp[i][0];
			}
			
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = orange_B[i][j];
				}
			}
			memcpy(orange_B, temp, sizeof(orange_B));
		}
		break;

	case 'U':
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = red_F[0][i];
				red_F[0][i] = green_L[0][i];
				green_L[0][i] = orange_B[0][i];
				orange_B[0][i] = blue_R[0][i];
				blue_R[0][i] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = white_U[i][j];
				}
			}
			memcpy(white_U, temp, sizeof(white_U));
		}
		else {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = red_F[0][i];
				red_F[0][i] = blue_R[0][i];
				blue_R[0][i] = orange_B[0][i]; 
				orange_B[0][i] = green_L[0][i];
				green_L[0][i] = temp[i][0];
			}

			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = white_U[i][j];
				}
			}
			memcpy(white_U, temp, sizeof(white_U));
		}
		break;

	case 'D':
		if (cmd_dir == '-') {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = red_F[2][i];
				red_F[2][i] = blue_R[2][i];
				blue_R[2][i] = orange_B[2][i];
				orange_B[2][i] = green_L[2][i];
				green_L[2][i] = temp[i][0];
			}
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[2 - j][i] = yellow_D[i][j];
				}
			}
			memcpy(yellow_D, temp, sizeof(yellow_D));
		}
		else {
			char temp[3][3];
			for (int i = 0; i < 3; i++) {
				temp[i][0] = red_F[2][i];
				red_F[2][i] = green_L[2][i];
				green_L[2][i] = orange_B[2][i];
				orange_B[2][i] = blue_R[2][i];
				blue_R[2][i] = temp[i][0];
			}

			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					temp[j][2 - i] = yellow_D[i][j];
				}
			}
			memcpy(yellow_D, temp, sizeof(yellow_D));
		}
		break;
	}
	return;
}

int main() {

	scanf("%d ", &T);
	for (int i = 0; i < T; i++) {
		scanf("%d ", &n);
		iniCube();
		for (int j = 0; j < n; j++) {
			scanf(" %c%c", &cmd_Demesion, &cmd_dir);		
			simulation(cmd_Demesion, cmd_dir);		
		}
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				printf("%c", white_U[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}