sol : 138' 33''
Learnings
- 깔끔하게 전부 정리하고 풀면 1시간 이내도 가능했을 것.
- 암산 절대금지
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define U 0
#define D 1
#define F 2
#define B 3
#define L 4
#define R 5
#define CW 0
#define CCW 1
int T;
struct Order {
int face;
int dir;
};
vector<Order> orders;
char colors[6] = { 'w', 'y', 'r', 'o', 'g', 'b' };
char cube[6][3][3];
int Translator(char order) {
if (order == 'U') return U;
if (order == 'D') return D;
if (order == 'F') return F;
if (order == 'B') return B;
if (order == 'L') return L;
if (order == 'R') return R;
if (order == '+') return CW;
if (order == '-') return CCW;
}
void RotateOutter(int face, int dir) {
char tempFace[3][3];
// 시계 회전
if (dir == CW) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tempFace[j][2 - i] = cube[face][i][j];
}
}
}
// 반시계 회전
else if (dir == CCW) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tempFace[2 - j][i] = cube[face][i][j];
}
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cube[face][i][j] = tempFace[i][j];
}
}
}
void Rotater(int face, int dir) {
RotateOutter(face, dir);
if (face == U) {
char temp[3] = { cube[R][0][0], cube[R][0][1], cube[R][0][2] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[R][0][x] = cube[B][0][x];
}
for (int x = 0; x < 3; x++) {
cube[B][0][x] = cube[L][0][x];
}
for (int x = 0; x < 3; x++) {
cube[L][0][x] = cube[F][0][x];
}
for (int x = 0; x < 3; x++) {
cube[F][0][x] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[R][0][x] = cube[F][0][x];
}
for (int x = 0; x < 3; x++) {
cube[F][0][x] = cube[L][0][x];
}
for (int x = 0; x < 3; x++) {
cube[L][0][x] = cube[B][0][x];
}
for (int x = 0; x < 3; x++) {
cube[B][0][x] = temp[x];
}
}
}
else if (face == D) {
char temp[3] = { cube[R][2][0], cube[R][2][1], cube[R][2][2] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[R][2][x] = cube[F][2][x];
}
for (int x = 0; x < 3; x++) {
cube[F][2][x] = cube[L][2][x];
}
for (int x = 0; x < 3; x++) {
cube[L][2][x] = cube[B][2][x];
}
for (int x = 0; x < 3; x++) {
cube[B][2][x] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[R][2][x] = cube[B][2][x];
}
for (int x = 0; x < 3; x++) {
cube[B][2][x] = cube[L][2][x];
}
for (int x = 0; x < 3; x++) {
cube[L][2][x] = cube[F][2][x];
}
for (int x = 0; x < 3; x++) {
cube[F][2][x] = temp[x];
}
}
}
else if (face == F) {
char temp[3] = { cube[U][2][0], cube[U][2][1], cube[U][2][2] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[U][2][x] = cube[L][2 - x][2];
}
for (int x = 0; x < 3; x++) {
cube[L][2 - x][2] = cube[D][0][2 - x];
}
for (int x = 0; x < 3; x++) {
cube[D][0][2 - x] = cube[R][x][0];
}
for (int x = 0; x < 3; x++) {
cube[R][x][0] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[U][2][x] = cube[R][x][0];
}
for (int x = 0; x < 3; x++) {
cube[R][x][0] = cube[D][0][2 - x];
}
for (int x = 0; x < 3; x++) {
cube[D][0][2 - x] = cube[L][2 - x][2];
}
for (int x = 0; x < 3; x++) {
cube[L][2 - x][2] = temp[x];
}
}
}
else if (face == B) {
char temp[3] = { cube[U][0][0], cube[U][0][1], cube[U][0][2] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[U][0][x] = cube[R][x][2];
}
for (int x = 0; x < 3; x++) {
cube[R][x][2] = cube[D][2][2 - x];
}
for (int x = 0; x < 3; x++) {
cube[D][2][2 - x] = cube[L][2 - x][0];
}
for (int x = 0; x < 3; x++) {
cube[L][2 - x][0] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[U][0][x] = cube[L][2 - x][0];
}
for (int x = 0; x < 3; x++) {
cube[L][2 - x][0] = cube[D][2][2 - x];
}
for (int x = 0; x < 3; x++) {
cube[D][2][2 - x] = cube[R][x][2];
}
for (int x = 0; x < 3; x++) {
cube[R][x][2] = temp[x];
}
}
}
else if (face == L) {
char temp[3] = { cube[U][0][0], cube[U][1][0], cube[U][2][0] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[U][x][0] = cube[B][2 - x][2];
}
for (int x = 0; x < 3; x++) {
cube[B][2 - x][2] = cube[D][x][0];
}
for (int x = 0; x < 3; x++) {
cube[D][x][0] = cube[F][x][0];
}
for (int x = 0; x < 3; x++) {
cube[F][x][0] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[U][x][0] = cube[F][x][0];
}
for (int x = 0; x < 3; x++) {
cube[F][x][0] = cube[D][x][0];
}
for (int x = 0; x < 3; x++) {
cube[D][x][0] = cube[B][2 - x][2];
}
for (int x = 0; x < 3; x++) {
cube[B][2 - x][2] = temp[x];
}
}
}
else if (face == R) {
char temp[3] = { cube[U][0][2], cube[U][1][2], cube[U][2][2] };
if (dir == CW) {
for (int x = 0; x < 3; x++) {
cube[U][x][2] = cube[F][x][2];
}
for (int x = 0; x < 3; x++) {
cube[F][x][2] = cube[D][x][2];
}
for (int x = 0; x < 3; x++) {
cube[D][x][2] = cube[B][2 - x][0];
}
for (int x = 0; x < 3; x++) {
cube[B][2 - x][0] = temp[x];
}
}
else if (dir == CCW) {
for (int x = 0; x < 3; x++) {
cube[U][x][2] = cube[B][2 - x][0];
}
for (int x = 0; x < 3; x++) {
cube[B][2 - x][0] = cube[D][x][2];
}
for (int x = 0; x < 3; x++) {
cube[D][x][2] = cube[F][x][2];
}
for (int x = 0; x < 3; x++) {
cube[F][x][2] = temp[x];
}
}
}
}
void Init() {
int r;
cin >> r;
orders.resize(r);
for (int f = 0; f < 6; f++) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cube[f][i][j] = colors[f];
}
}
}
for (int i = 0; i < r; i++) {
string order;
cin >> order;
orders[i].face = Translator(order[0]);
orders[i].dir = Translator(order[1]);
}
}
void PrintUpFace() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << cube[U][i][j];
}
cout << '\n';
}
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> T;
for (int t = 1; t <= T; t++) {
Init();
for (int o = 0; o < orders.size(); o++) {
Rotater(orders[o].face, orders[o].dir);
}
PrintUpFace();
}
return 0;
}