문제 풀이/백준

백준 - 큐빙 (5373) [C++]

JJJaewon 2024. 4. 6. 23:08
반응형

이 문제는 구현, 시뮬레이션 문제이다.

 

구현이 매우 까다로운데, 큐브가 매우 작아 구현만 하면 정답이 나온다.

 

중요한 포인트가 몇 가지 있는데, 첫번째는 면의 기준을 잘 정하는 것이다.

각 면에 대한 배열을 만들고, 각 면의 상하좌우에는 어떤 면이 존재하는지를 먼저 정하고 구현에 들어가야한다.

 

두번째로는 각 면을 정면으로 봤을 때 상하좌우 면의 방향을 잘 확인하는 것이다.

돌렸을 때 역방향인 경우에는 방향을 바꾸어서 집어넣어줘야 제대로 값이 들어가게 된다.

 

마지막으로 옆면 뿐만 아니라 정면도 같이 돌려줘야 한다. 옆면에 너무 집중하다보니 앞면도 돌려줘야 한다는 사실을 까먹는다. 계속 정답이 안 나오던 문제가 앞면까지 돌려주자마자 바로 정답이 나왔다.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define UP 0
#define DOWN 1
#define FRONT 2
#define BACK 3
#define LEFT 4
#define RIGHT 5

typedef vector<vector<vector<char>>> V;

int n;
vector<string> commands;
V cube;

void init() {
	cube = V(6, vector<vector<char>>(3, vector<char>(3, 0)));
	commands.clear();
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[UP][y][x] = 'w';
		}
	}
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[DOWN][y][x] = 'y';
		}
	}
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[FRONT][y][x] = 'r';
		}
	}
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[BACK][y][x] = 'o';
		}
	}
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[LEFT][y][x] = 'g';
		}
	}
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cube[RIGHT][y][x] = 'b';
		}
	}
}

vector<vector<char>> rollPlane(vector<vector<char>>& temp, char direction) {
	vector<vector<char>> result = temp;
	if (direction == '+') {
		for (int y = 0; y < 3; y++) {
			for (int x = 0; x < 3; x++) {
				result[y][x] = temp[2-x][y];
			}
		}
	} else {
		for (int y = 0; y < 3; y++) {
			for (int x = 0; x < 3; x++) {
				result[y][x] = temp[x][2-y];
			}
		}
	}
	return result;
}

void up(char direction) {	/// clear
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[UP], direction);
	result[UP] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[RIGHT][0][i] = cube[BACK][0][i];
			result[FRONT][0][i] = cube[RIGHT][0][i];
			result[LEFT][0][i] = cube[FRONT][0][i];
			result[BACK][0][i] = cube[LEFT][0][i];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[LEFT][0][i] = cube[BACK][0][i];
			result[FRONT][0][i] = cube[LEFT][0][i];
			result[RIGHT][0][i] = cube[FRONT][0][i];
			result[BACK][0][i] = cube[RIGHT][0][i];
		}
	}
	cube = result;
}

void down(char direction) {	// clear
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[DOWN], direction);
	result[DOWN] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[RIGHT][2][i] = cube[FRONT][2][i];
			result[BACK][2][i] = cube[RIGHT][2][i];
			result[LEFT][2][i] = cube[BACK][2][i];
			result[FRONT][2][i] = cube[LEFT][2][i];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[LEFT][2][i] = cube[FRONT][2][i];
			result[BACK][2][i] = cube[LEFT][2][i];
			result[RIGHT][2][i] = cube[BACK][2][i];
			result[FRONT][2][i] = cube[RIGHT][2][i];
		}
	}
	cube = result;
}


void front(char direction) {	// clear
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[FRONT], direction);
	result[FRONT] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[RIGHT][i][0] = cube[UP][2][i];
			result[DOWN][0][2-i] = cube[RIGHT][i][0];
			result[LEFT][i][2] = cube[DOWN][0][i];
			result[UP][2][2-i] = cube[LEFT][i][2];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[LEFT][2-i][2] = cube[UP][2][i];
			result[DOWN][0][i] = cube[LEFT][i][2];
			result[RIGHT][2-i][0] = cube[DOWN][0][i];
			result[UP][2][i] = cube[RIGHT][i][0];
		}
	}
	cube = result;
}

void back(char direction) {
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[BACK], direction);
	result[BACK] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[LEFT][2-i][0] = cube[UP][0][i];
			result[DOWN][2][i] = cube[LEFT][i][0];
			result[RIGHT][2-i][2] = cube[DOWN][2][i];
			result[UP][0][i] = cube[RIGHT][i][2];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[RIGHT][i][2] = cube[UP][0][i];
			result[DOWN][2][2-i] = cube[RIGHT][i][2];
			result[LEFT][i][0] = cube[DOWN][2][i];
			result[UP][0][2-i] = cube[LEFT][i][0];
		}
	}
	cube = result;
}

void left(char direction) {	// clear
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[LEFT], direction);
	result[LEFT] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[FRONT][i][0] = cube[UP][i][0];
			result[DOWN][i][0] = cube[FRONT][i][0];
			result[BACK][2-i][2] = cube[DOWN][i][0];
			result[UP][2-i][0] = cube[BACK][i][2];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[BACK][2-i][2] = cube[UP][i][0];
			result[DOWN][2-i][0] = cube[BACK][i][2];
			result[FRONT][i][0] = cube[DOWN][i][0];
			result[UP][i][0] = cube[FRONT][i][0];
		}
	}
	cube = result;
}

void right(char direction) {
	V result = cube;
	vector<vector<char>> plane = rollPlane(cube[RIGHT], direction);
	result[RIGHT] = plane;
	if (direction == '+') {	// clock
		for (int i = 0; i < 3; i++) {
			result[BACK][2-i][0] = cube[UP][i][2];
			result[DOWN][2-i][2] = cube[BACK][i][0];
			result[FRONT][i][2] = cube[DOWN][i][2];
			result[UP][i][2] = cube[FRONT][i][2];
		}
	} else {	// counter clock
		for (int i = 0; i < 3; i++) {
			result[FRONT][i][2] = cube[UP][i][2];
			result[DOWN][i][2] = cube[FRONT][i][2];
			result[BACK][2-i][0] = cube[DOWN][i][2];
			result[UP][2-i][2] = cube[BACK][i][0];
		}
	}
	cube = result;
}

void input() {
	init();
	cin >> n;
	for (int i = 0; i < n; i++) {
		string cmd;
		cin >> cmd;
		commands.push_back(cmd);
	}
}

void solve() {
	for (string& cmd : commands) {
		char plane = cmd[0];
		char direction = cmd[1];
		switch (plane) {
		case 'U':
			up(direction);
			break;
		case 'D':
			down(direction);
			break;
		case 'F':
			front(direction);
			break;
		case 'B':
			back(direction);
			break;
		case 'L':
			left(direction);
			break;
		case 'R':
			right(direction);
			break;
		}
	}
}

void output() {
	for (int y = 0; y < 3; y++) {
		for (int x = 0; x < 3; x++) {
			cout << cube[UP][y][x];
		}
		cout << '\n';
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int T;
	cin >> T;
	for (int testCase = 0; testCase < T; testCase++) {
		input();
		solve();
		output();
	}
	return 0;
}
반응형