백준 5373번 : 큐빙

Nitroblue 1·2026년 4월 8일

코딩테스트 준비

목록 보기
96/102

sol : 138' 33''

  • 수행 시간 : 4ms
  • 메모리 : 2168KB

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;
}

0개의 댓글