백준 5373번 큐빙 문제풀이(C++)

YooHeeJoon·2022년 9월 17일
0

백준 문제풀이

목록 보기
4/56

백준 5373번 큐빙

아이디어

테스트 케이스 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;
}

0개의 댓글

관련 채용 정보