테스트 케이스 100개 이하 x 될린횟수 1000번 이하 ≒ 최대 횟수는 100,000번
즉 브루트포스로 가능하다 -> 무식하게 풀어보자!!
하나하나 다 직접 모든 기능을 구현해서 해결했다.
#include<bits/stdc++.h>
using namespace std;
#define MAX 1010
#define INF 2147483647
char cube[8][4][4];
void init() {
for (int i = 0; i < 6; i++) {
char color = 0;
switch (i) {
case 0:color = 'w'; break; // 윗면
case 1:color = 'o'; break; // 뒷면
case 2:color = 'b'; break; // 오른쪽 면
case 3:color = 'r'; break; // 앞면
case 4:color = 'g'; break; // 왼쪽 면
case 5:color = 'y'; break; // 아랫면
}
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
cube[i][j][k] = color;
}
}
}
return;
}
void turn(int side, char direct) { // 해당 면 회전
if (direct == '+') {
swap(cube[side][0][0], cube[side][0][2]);
swap(cube[side][0][0], cube[side][2][2]);
swap(cube[side][0][0], cube[side][2][0]);
swap(cube[side][0][1], cube[side][1][2]);
swap(cube[side][0][1], cube[side][2][1]);
swap(cube[side][0][1], cube[side][1][0]);
}
else {
swap(cube[side][0][0], cube[side][2][0]);
swap(cube[side][0][0], cube[side][2][2]);
swap(cube[side][0][0], cube[side][0][2]);
swap(cube[side][0][1], cube[side][1][0]);
swap(cube[side][0][1], cube[side][2][1]);
swap(cube[side][0][1], cube[side][1][2]);
}
}
void upNdown(char sides, char direct) {
int dir = direct == '+' ? 1 : -1;
if (sides == 'D') dir *= -1;
int idx = dir == 1 ? 2 : 4;
int upDown = sides == 'U' ? 0 : 2;
while (2 <= idx && idx <= 4) {
swap(cube[1][upDown][0], cube[idx][upDown][0]);
swap(cube[1][upDown][1], cube[idx][upDown][1]);
swap(cube[1][upDown][2], cube[idx][upDown][2]);
idx += dir;
}
turn(sides == 'U' ? 0 : 5 , direct);
}
void frontNback(char sides, char direct) {
int front = sides == 'F' ? 2 : 0;
//0 2 5 4
if (sides == 'F' && direct == '+' || sides == 'B' && direct == '-') {
swap(cube[0][front][0], cube[2][0][front == 2 ? 0 : 2]);
swap(cube[0][front][1], cube[2][1][front == 2 ? 0 : 2]);
swap(cube[0][front][2], cube[2][2][front == 2 ? 0 : 2]);
swap(cube[0][front][0], cube[5][front][0]);
swap(cube[0][front][1], cube[5][front][1]);
swap(cube[0][front][2], cube[5][front][2]);
swap(cube[0][front][0], cube[4][2][front]);
swap(cube[0][front][1], cube[4][1][front]);
swap(cube[0][front][2], cube[4][0][front]);
}
// 0 4 5 2
else {
swap(cube[0][front][0], cube[4][2][front]);
swap(cube[0][front][1], cube[4][1][front]);
swap(cube[0][front][2], cube[4][0][front]);
swap(cube[0][front][0], cube[5][front][0]);
swap(cube[0][front][1], cube[5][front][1]);
swap(cube[0][front][2], cube[5][front][2]);
swap(cube[0][front][0], cube[2][0][front == 2 ? 0 : 2]);
swap(cube[0][front][1], cube[2][1][front == 2 ? 0 : 2]);
swap(cube[0][front][2], cube[2][2][front == 2 ? 0 : 2]);
}
turn(sides == 'F' ? 3 : 1, direct);
}
void leftNright(char sides, char direct) {
int left = sides == 'L' ? 0 : 2;
//0 3 5 1
if (sides == 'L' && direct == '+' || sides=='R' && direct == '-') {
swap(cube[0][0][left], cube[3][0][left]);
swap(cube[0][1][left], cube[3][1][left]);
swap(cube[0][2][left], cube[3][2][left]);
swap(cube[0][0][left], cube[5][2][left == 0 ? 2 : 0 ]);
swap(cube[0][1][left], cube[5][1][left == 0 ? 2 : 0]);
swap(cube[0][2][left], cube[5][0][left == 0 ? 2 : 0]);
swap(cube[0][0][left], cube[1][2][left == 0 ? 2 : 0]);
swap(cube[0][1][left], cube[1][1][left == 0 ? 2 : 0]);
swap(cube[0][2][left], cube[1][0][left == 0 ? 2 : 0]);
}
// 0 1 5 3
else {
swap(cube[0][0][left], cube[1][2][left == 0 ? 2 : 0]);
swap(cube[0][1][left], cube[1][1][left == 0 ? 2 : 0]);
swap(cube[0][2][left], cube[1][0][left == 0 ? 2 : 0]);
swap(cube[0][0][left], cube[5][2][left == 0 ? 2 : 0]);
swap(cube[0][1][left], cube[5][1][left == 0 ? 2 : 0]);
swap(cube[0][2][left], cube[5][0][left == 0 ? 2 : 0]);
swap(cube[0][0][left], cube[3][0][left]);
swap(cube[0][1][left], cube[3][1][left]);
swap(cube[0][2][left], cube[3][2][left]);
}
turn(sides == 'L' ? 4 : 2, direct);
}
void printCubeTopSide() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << cube[0][i][j];
cout << '\n';
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int tc; cin >> tc;
while (tc--) {
init();
int n; cin >> n;
while (n--) {
char sides(0), direct(0);
cin >> sides >> direct;
switch (sides) {
case 'U': case 'D': upNdown(sides, direct); break;
case 'F': case 'B': frontNback(sides, direct); break;
case 'L': case 'R': leftNright(sides, direct); break;
}
}
printCubeTopSide();
}
return 0;
}