BOJ 풀이

[BOJ/백준 5373/C++] 큐빙

Vfly 2023. 4. 13. 15:53

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

 

5373번: 큐빙

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

www.acmicpc.net

 

[문제 요약]

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

- 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.

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

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

 

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

 

[문제 조건]

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

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

- 시간 제한 : 1초

- 메모리 제한 : 128MB

 

[문제 풀이]

이번 문제는 구현과 시뮬레이션 장르의 문제다.

 

따라서 그냥 무지성으로 큐브를 구현해주면 되는데... 생각보다 경우의 수가 꽤 있고, 생각보다 귀찮은 문제다.

 

우리가 큐브를 정면에서 바라봤을때 기준으로 모든 회전 시키는 면에 대해 (시계방향 or 반시계 방향) 2가지 경우가 있고, 앞, 뒤, 왼쪽, 오른쪽, 위, 아래를 돌리는 경우 6가지로 총 12개의 회전 함수를 작성해줘야 된다.

 

[큐브 회전 함수 12개]

//0=w, 1=y, 2=r, 3=or, 4=g, 5=b
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
vector<vector<vector<int>>> cube;

void left_clock()
{
	//왼쪽면 = 4
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2-i] = cube[4][i][j];
	cube[4] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//위
	for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
	//뒤->위
	for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
	//밑->뒤
	for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
	//앞->밑
	for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
	//위->앞
	for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}

void left_reverse_clock()
{
	//왼쪽면 = 4
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2-j][i] = cube[4][i][j];
	cube[4] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][0];
	//뒤->아래
	for (int i = 0; i < 3; i++) cube[1][2-i][0] = cube[3][i][2];
	//위->뒤
	for (int i = 0; i < 3; i++) cube[3][2-i][2] = cube[0][i][0];
	//앞->위
	for (int i = 0; i < 3; i++) cube[0][i][0] = cube[2][i][0];
	//아래->앞
	for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}

void right_clock()
{
	//오른쪽면 = 5
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[5][i][j];
	cube[5] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
	//뒤->아래
	for (int i = 0; i < 3; i++) cube[1][2-i][2] = cube[3][i][0];
	//위->뒤
	for (int i = 0; i < 3; i++) cube[3][2 - i][0] = cube[0][i][2];
	//앞->위
	for (int i = 0; i < 3; i++) cube[0][i][2] = cube[2][i][2];
	//아래->앞
	for (int i = 0; i < 3; i++) cube[2][i][2] = tmp2[i];
}

void right_reverse_clock()
{
	//오른쪽면 = 5
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2-j][i] = cube[5][i][j];
	cube[5] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
	//앞->아래
	for (int i = 0; i < 3; i++) cube[1][i][2] = cube[2][i][2];
	//위->앞
	for (int i = 0; i < 3; i++) cube[2][i][2] = cube[0][i][2];
	//뒤->위
	for (int i = 0; i < 3; i++) cube[0][2-i][2] = cube[3][i][0];
	//아래->뒤
	for (int i = 0; i < 3; i++) cube[3][2-i][0] = tmp2[i];
}

void front_clock()
{
	//앞면 = 2
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[2][i][j];
	cube[2] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
	//오른->아래
	for (int i = 0; i < 3; i++) cube[1][0][2-i] = cube[5][i][0];
	//위->오른
	for (int i = 0; i < 3; i++) cube[5][i][0] = cube[0][2][i];
	//왼->위
	for (int i = 0; i < 3; i++) cube[0][2][2-i] = cube[4][i][2];
	//아래->왼
	for (int i = 0; i < 3; i++) cube[4][i][2] = tmp2[i];
}

void front_reverse_clock()
{
	//앞면 = 2
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[2][i][j];
	cube[2] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
	//왼->아래
	for (int i = 0; i < 3; i++) cube[1][0][i] = cube[4][i][2];
	//위->왼
	for (int i = 0; i < 3; i++) cube[4][2-i][2] = cube[0][2][i];
	//오른->위
	for (int i = 0; i < 3; i++) cube[0][2][i] = cube[5][i][0];
	//아래->오른
	for (int i = 0; i < 3; i++) cube[5][2-i][0] = tmp2[i];
}

void back_clock()
{
	//뒷면 = 3
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[3][i][j];
	cube[3] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][i];
	//왼->아래
	for (int i = 0; i < 3; i++) cube[1][2][i] = cube[4][i][0];
	//위->왼
	for (int i = 0; i < 3; i++) cube[4][2-i][0] = cube[0][0][i];
	//오른->위
	for (int i = 0; i < 3; i++) cube[0][0][i] = cube[5][i][2];
	//아래->오른
	for (int i = 0; i < 3; i++) cube[5][2-i][2] = tmp2[i];
}

void back_reverse_clock()
{
	//뒷면 = 3
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[3][i][j];
	cube[3] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][2 - i];
	//오른->아래
	for (int i = 0; i < 3; i++) cube[1][2][2 - i] = cube[5][i][2];
	//위->오른
	for (int i = 0; i < 3; i++) cube[5][i][2] = cube[0][0][i];
	//왼->위
	for (int i = 0; i < 3; i++) cube[0][0][2 - i] = cube[4][i][0];
	//아래-왼
	for (int i = 0; i < 3; i++) cube[4][2 - i][0] = tmp2[i];
}

void up_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[0][i][j];
	cube[0] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
	//오른->앞
	for (int i = 0; i < 3; i++) cube[2][0][i] = cube[5][0][i];
	//뒤->오른
	for (int i = 0; i < 3; i++) cube[5][0][i] = cube[3][0][i];
	//왼->뒤
	for (int i = 0; i < 3; i++) cube[3][0][i] = cube[4][0][i];
	//앞->왼
	for (int i = 0; i < 3; i++) cube[4][0][i] = tmp2[i];
}

void up_reverse_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[0][i][j];
	cube[0] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
	//왼->앞
	for (int i = 0; i < 3; i++) cube[2][0][i] = cube[4][0][i];
	//뒤->왼
	for (int i = 0; i < 3; i++) cube[4][0][i] = cube[3][0][i];
	//오른->뒤
	for (int i = 0; i < 3; i++) cube[3][0][i] = cube[5][0][i];
	//앞->오른
	for (int i = 0; i < 3; i++) cube[5][0][i] = tmp2[i];
}

void down_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[1][i][j];
	cube[1] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
	//왼->앞
	for (int i = 0; i < 3; i++) cube[2][2][i] = cube[4][2][i];
	//뒤->왼
	for (int i = 0; i < 3; i++) cube[4][2][i] = cube[3][2][i];
	//오른->뒤
	for (int i = 0; i < 3; i++) cube[3][2][i] = cube[5][2][i];
	//앞->오른
	for (int i = 0; i < 3; i++) cube[5][2][i] = tmp2[i];
}

void down_reverse_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[1][i][j];
	cube[1] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
	//오른->앞
	for (int i = 0; i < 3; i++) cube[2][2][i] = cube[5][2][i];
	//뒤->오른
	for (int i = 0; i < 3; i++) cube[5][2][i] = cube[3][2][i];
	//왼->뒤
	for (int i = 0; i < 3; i++) cube[3][2][i] = cube[4][2][i];
	//앞->왼
	for (int i = 0; i < 3; i++) cube[4][2][i] = tmp2[i];
}

 

모든 함수에 공통적으로 각 면들에 대해 시계방향 or 반시계방향 회전했을 때 '면' 기준으로 위치들을 바꿔주는 코드다.

//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오

//시계회전
for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        tmp[j][2-i] = cube[(면 번호)][i][j];
cube[(면 번호)] = tmp;

//반시계회전
for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        tmp[2-j][i] = cube[(면 번호)][i][j];
cube[(면 번호)] = tmp;

 

그리고 각 함수마다 아래와 같은 부분이 존재하는데 이 부분은 다음과 같다.

//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//위
for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
//밑->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
//앞->밑
for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];

해당 면에 대한 값들의 이동이 아니라 예를들어 초록색면을 돌린다고 했을때, 초록색면에 붙어있는 흰색부분과 빨간색 부분을 돌려주는 코드들이다.

 

이번문제는 큰 생각 없이 값들을 올바른 위치로 옮겨주는 코드들만 작성해주면 풀리는 문제다.

 

[전체 소스 코드]

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <set>

#define INF 987654321
#define mod 1000000007
#define pii pair<int,int>
#define MAX 7
#define ll long long

using namespace std;

//0=w, 1=y, 2=r, 3=or, 4=g, 5=b
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
vector<vector<vector<int>>> cube;

void left_clock()
{
	//왼쪽면 = 4
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2-i] = cube[4][i][j];
	cube[4] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//위
	for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
	//뒤->위
	for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
	//밑->뒤
	for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
	//앞->밑
	for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
	//위->앞
	for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}

void left_reverse_clock()
{
	//왼쪽면 = 4
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2-j][i] = cube[4][i][j];
	cube[4] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][0];
	//뒤->아래
	for (int i = 0; i < 3; i++) cube[1][2-i][0] = cube[3][i][2];
	//위->뒤
	for (int i = 0; i < 3; i++) cube[3][2-i][2] = cube[0][i][0];
	//앞->위
	for (int i = 0; i < 3; i++) cube[0][i][0] = cube[2][i][0];
	//아래->앞
	for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}

void right_clock()
{
	//오른쪽면 = 5
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[5][i][j];
	cube[5] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
	//뒤->아래
	for (int i = 0; i < 3; i++) cube[1][2-i][2] = cube[3][i][0];
	//위->뒤
	for (int i = 0; i < 3; i++) cube[3][2 - i][0] = cube[0][i][2];
	//앞->위
	for (int i = 0; i < 3; i++) cube[0][i][2] = cube[2][i][2];
	//아래->앞
	for (int i = 0; i < 3; i++) cube[2][i][2] = tmp2[i];
}

void right_reverse_clock()
{
	//오른쪽면 = 5
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2-j][i] = cube[5][i][j];
	cube[5] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
	//앞->아래
	for (int i = 0; i < 3; i++) cube[1][i][2] = cube[2][i][2];
	//위->앞
	for (int i = 0; i < 3; i++) cube[2][i][2] = cube[0][i][2];
	//뒤->위
	for (int i = 0; i < 3; i++) cube[0][2-i][2] = cube[3][i][0];
	//아래->뒤
	for (int i = 0; i < 3; i++) cube[3][2-i][0] = tmp2[i];
}

void front_clock()
{
	//앞면 = 2
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[2][i][j];
	cube[2] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
	//오른->아래
	for (int i = 0; i < 3; i++) cube[1][0][2-i] = cube[5][i][0];
	//위->오른
	for (int i = 0; i < 3; i++) cube[5][i][0] = cube[0][2][i];
	//왼->위
	for (int i = 0; i < 3; i++) cube[0][2][2-i] = cube[4][i][2];
	//아래->왼
	for (int i = 0; i < 3; i++) cube[4][i][2] = tmp2[i];
}

void front_reverse_clock()
{
	//앞면 = 2
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[2][i][j];
	cube[2] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
	//왼->아래
	for (int i = 0; i < 3; i++) cube[1][0][i] = cube[4][i][2];
	//위->왼
	for (int i = 0; i < 3; i++) cube[4][2-i][2] = cube[0][2][i];
	//오른->위
	for (int i = 0; i < 3; i++) cube[0][2][i] = cube[5][i][0];
	//아래->오른
	for (int i = 0; i < 3; i++) cube[5][2-i][0] = tmp2[i];
}

void back_clock()
{
	//뒷면 = 3
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[3][i][j];
	cube[3] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][i];
	//왼->아래
	for (int i = 0; i < 3; i++) cube[1][2][i] = cube[4][i][0];
	//위->왼
	for (int i = 0; i < 3; i++) cube[4][2-i][0] = cube[0][0][i];
	//오른->위
	for (int i = 0; i < 3; i++) cube[0][0][i] = cube[5][i][2];
	//아래->오른
	for (int i = 0; i < 3; i++) cube[5][2-i][2] = tmp2[i];
}

void back_reverse_clock()
{
	//뒷면 = 3
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[3][i][j];
	cube[3] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//아래
	for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][2 - i];
	//오른->아래
	for (int i = 0; i < 3; i++) cube[1][2][2 - i] = cube[5][i][2];
	//위->오른
	for (int i = 0; i < 3; i++) cube[5][i][2] = cube[0][0][i];
	//왼->위
	for (int i = 0; i < 3; i++) cube[0][0][2 - i] = cube[4][i][0];
	//아래-왼
	for (int i = 0; i < 3; i++) cube[4][2 - i][0] = tmp2[i];
}

void up_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[0][i][j];
	cube[0] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
	//오른->앞
	for (int i = 0; i < 3; i++) cube[2][0][i] = cube[5][0][i];
	//뒤->오른
	for (int i = 0; i < 3; i++) cube[5][0][i] = cube[3][0][i];
	//왼->뒤
	for (int i = 0; i < 3; i++) cube[3][0][i] = cube[4][0][i];
	//앞->왼
	for (int i = 0; i < 3; i++) cube[4][0][i] = tmp2[i];
}

void up_reverse_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[0][i][j];
	cube[0] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
	//왼->앞
	for (int i = 0; i < 3; i++) cube[2][0][i] = cube[4][0][i];
	//뒤->왼
	for (int i = 0; i < 3; i++) cube[4][0][i] = cube[3][0][i];
	//오른->뒤
	for (int i = 0; i < 3; i++) cube[3][0][i] = cube[5][0][i];
	//앞->오른
	for (int i = 0; i < 3; i++) cube[5][0][i] = tmp2[i];
}

void down_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[j][2 - i] = cube[1][i][j];
	cube[1] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
	//왼->앞
	for (int i = 0; i < 3; i++) cube[2][2][i] = cube[4][2][i];
	//뒤->왼
	for (int i = 0; i < 3; i++) cube[4][2][i] = cube[3][2][i];
	//오른->뒤
	for (int i = 0; i < 3; i++) cube[3][2][i] = cube[5][2][i];
	//앞->오른
	for (int i = 0; i < 3; i++) cube[5][2][i] = tmp2[i];
}

void down_reverse_clock()
{
	//윗면 = 0
	vector<vector<int>> tmp;
	tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			tmp[2 - j][i] = cube[1][i][j];
	cube[1] = tmp;

	vector<int> tmp2(3, 0);

	//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
	//앞
	for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
	//오른->앞
	for (int i = 0; i < 3; i++) cube[2][2][i] = cube[5][2][i];
	//뒤->오른
	for (int i = 0; i < 3; i++) cube[5][2][i] = cube[3][2][i];
	//왼->뒤
	for (int i = 0; i < 3; i++) cube[3][2][i] = cube[4][2][i];
	//앞->왼
	for (int i = 0; i < 3; i++) cube[4][2][i] = tmp2[i];
}

void print_cube()
{
	for (int j = 0; j < 3; j++)
	{
		for (int h = 0; h < 3; h++)
		{
			int color = cube[0][j][h];
			if (color == 0) cout << "w";
			else if (color == 1) cout << "y";
			else if (color == 2) cout << "r";
			else if (color == 3) cout << "o";
			else if (color == 4) cout << "g";
			else if (color == 5) cout << "b";
		}
		cout << "\n";
	}
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cube.resize(6);
	for (int i = 0; i < 6; i++)
	{
		cube[i].resize(3);
		for (int j = 0; j < 3; j++)
			cube[i][j].resize(3);
	}

	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 3; j++)
			for (int h = 0; h < 3; h++)
				cube[i][j][h] = i;
	}

	int T;
	cin >> T;
	while (T--)
	{
		for (int i = 0; i < 6; i++)
		{
			for (int j = 0; j < 3; j++)
				for (int h = 0; h < 3; h++)
					cube[i][j][h] = i;
		}

		int op_cnt;
		cin >> op_cnt;
		for (int i = 0; i < op_cnt; i++)
		{
			string op;
			cin >> op;

			if (op[0] == 'U')
			{
				if (op[1] == '+')
					up_clock();
				else
					up_reverse_clock();
			}
			else if (op[0] == 'D')
			{
				if (op[1] == '+')
					down_clock();
				else
					down_reverse_clock();
			}
			else if (op[0] == 'F')
			{
				if (op[1] == '+')
					front_clock();
				else
					front_reverse_clock();
			}
			else if (op[0] == 'B')
			{
				if (op[1] == '+')
					back_clock();
				else
					back_reverse_clock();
			}
			else if (op[0] == 'L')
			{
				if (op[1] == '+')
					left_clock();
				else
					left_reverse_clock();
			}
			else if (op[0] == 'R')
			{
				if (op[1] == '+')
					right_clock();
				else
					right_reverse_clock();
			}

			
		}
		print_cube();
	}
}

'BOJ 풀이' 카테고리의 다른 글

[BOJ/백준 17245/C++] 서버실  (0) 2024.11.29
[BOJ/백준 9328/C++] 열쇠  (0) 2023.04.13
[BOJ/백준 7578/C++] 공장  (0) 2023.03.28
[BOJ/백준 2243/C++] 사탕상자  (0) 2023.03.28
[BOJ/백준 2042/C++] 구간 합 구하기  (0) 2023.03.23