https://www.acmicpc.net/problem/5373
5373번: 큐빙
각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란
www.acmicpc.net
[문제 요약]
- 큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다.
- 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.
- 이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.
- 루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.
- 각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.
[문제 조건]
- 첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.
- 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
- 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.
- 시간 제한 : 1초
- 메모리 제한 : 128MB
[문제 풀이]
이번 문제는 구현과 시뮬레이션 장르의 문제다.
따라서 그냥 무지성으로 큐브를 구현해주면 되는데... 생각보다 경우의 수가 꽤 있고, 생각보다 귀찮은 문제다.
우리가 큐브를 정면에서 바라봤을때 기준으로 모든 회전 시키는 면에 대해 (시계방향 or 반시계 방향) 2가지 경우가 있고, 앞, 뒤, 왼쪽, 오른쪽, 위, 아래를 돌리는 경우 6가지로 총 12개의 회전 함수를 작성해줘야 된다.
[큐브 회전 함수 12개]
//0=w, 1=y, 2=r, 3=or, 4=g, 5=b
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
vector<vector<vector<int>>> cube;
void left_clock()
{
//왼쪽면 = 4
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2-i] = cube[4][i][j];
cube[4] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//위
for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
//밑->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
//앞->밑
for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}
void left_reverse_clock()
{
//왼쪽면 = 4
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2-j][i] = cube[4][i][j];
cube[4] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][0];
//뒤->아래
for (int i = 0; i < 3; i++) cube[1][2-i][0] = cube[3][i][2];
//위->뒤
for (int i = 0; i < 3; i++) cube[3][2-i][2] = cube[0][i][0];
//앞->위
for (int i = 0; i < 3; i++) cube[0][i][0] = cube[2][i][0];
//아래->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}
void right_clock()
{
//오른쪽면 = 5
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[5][i][j];
cube[5] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
//뒤->아래
for (int i = 0; i < 3; i++) cube[1][2-i][2] = cube[3][i][0];
//위->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][0] = cube[0][i][2];
//앞->위
for (int i = 0; i < 3; i++) cube[0][i][2] = cube[2][i][2];
//아래->앞
for (int i = 0; i < 3; i++) cube[2][i][2] = tmp2[i];
}
void right_reverse_clock()
{
//오른쪽면 = 5
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2-j][i] = cube[5][i][j];
cube[5] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
//앞->아래
for (int i = 0; i < 3; i++) cube[1][i][2] = cube[2][i][2];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][2] = cube[0][i][2];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][2] = cube[3][i][0];
//아래->뒤
for (int i = 0; i < 3; i++) cube[3][2-i][0] = tmp2[i];
}
void front_clock()
{
//앞면 = 2
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[2][i][j];
cube[2] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
//오른->아래
for (int i = 0; i < 3; i++) cube[1][0][2-i] = cube[5][i][0];
//위->오른
for (int i = 0; i < 3; i++) cube[5][i][0] = cube[0][2][i];
//왼->위
for (int i = 0; i < 3; i++) cube[0][2][2-i] = cube[4][i][2];
//아래->왼
for (int i = 0; i < 3; i++) cube[4][i][2] = tmp2[i];
}
void front_reverse_clock()
{
//앞면 = 2
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[2][i][j];
cube[2] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
//왼->아래
for (int i = 0; i < 3; i++) cube[1][0][i] = cube[4][i][2];
//위->왼
for (int i = 0; i < 3; i++) cube[4][2-i][2] = cube[0][2][i];
//오른->위
for (int i = 0; i < 3; i++) cube[0][2][i] = cube[5][i][0];
//아래->오른
for (int i = 0; i < 3; i++) cube[5][2-i][0] = tmp2[i];
}
void back_clock()
{
//뒷면 = 3
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[3][i][j];
cube[3] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][i];
//왼->아래
for (int i = 0; i < 3; i++) cube[1][2][i] = cube[4][i][0];
//위->왼
for (int i = 0; i < 3; i++) cube[4][2-i][0] = cube[0][0][i];
//오른->위
for (int i = 0; i < 3; i++) cube[0][0][i] = cube[5][i][2];
//아래->오른
for (int i = 0; i < 3; i++) cube[5][2-i][2] = tmp2[i];
}
void back_reverse_clock()
{
//뒷면 = 3
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[3][i][j];
cube[3] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][2 - i];
//오른->아래
for (int i = 0; i < 3; i++) cube[1][2][2 - i] = cube[5][i][2];
//위->오른
for (int i = 0; i < 3; i++) cube[5][i][2] = cube[0][0][i];
//왼->위
for (int i = 0; i < 3; i++) cube[0][0][2 - i] = cube[4][i][0];
//아래-왼
for (int i = 0; i < 3; i++) cube[4][2 - i][0] = tmp2[i];
}
void up_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[0][i][j];
cube[0] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
//오른->앞
for (int i = 0; i < 3; i++) cube[2][0][i] = cube[5][0][i];
//뒤->오른
for (int i = 0; i < 3; i++) cube[5][0][i] = cube[3][0][i];
//왼->뒤
for (int i = 0; i < 3; i++) cube[3][0][i] = cube[4][0][i];
//앞->왼
for (int i = 0; i < 3; i++) cube[4][0][i] = tmp2[i];
}
void up_reverse_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[0][i][j];
cube[0] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
//왼->앞
for (int i = 0; i < 3; i++) cube[2][0][i] = cube[4][0][i];
//뒤->왼
for (int i = 0; i < 3; i++) cube[4][0][i] = cube[3][0][i];
//오른->뒤
for (int i = 0; i < 3; i++) cube[3][0][i] = cube[5][0][i];
//앞->오른
for (int i = 0; i < 3; i++) cube[5][0][i] = tmp2[i];
}
void down_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[1][i][j];
cube[1] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
//왼->앞
for (int i = 0; i < 3; i++) cube[2][2][i] = cube[4][2][i];
//뒤->왼
for (int i = 0; i < 3; i++) cube[4][2][i] = cube[3][2][i];
//오른->뒤
for (int i = 0; i < 3; i++) cube[3][2][i] = cube[5][2][i];
//앞->오른
for (int i = 0; i < 3; i++) cube[5][2][i] = tmp2[i];
}
void down_reverse_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[1][i][j];
cube[1] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
//오른->앞
for (int i = 0; i < 3; i++) cube[2][2][i] = cube[5][2][i];
//뒤->오른
for (int i = 0; i < 3; i++) cube[5][2][i] = cube[3][2][i];
//왼->뒤
for (int i = 0; i < 3; i++) cube[3][2][i] = cube[4][2][i];
//앞->왼
for (int i = 0; i < 3; i++) cube[4][2][i] = tmp2[i];
}
모든 함수에 공통적으로 각 면들에 대해 시계방향 or 반시계방향 회전했을 때 '면' 기준으로 위치들을 바꿔주는 코드다.
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//시계회전
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2-i] = cube[(면 번호)][i][j];
cube[(면 번호)] = tmp;
//반시계회전
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2-j][i] = cube[(면 번호)][i][j];
cube[(면 번호)] = tmp;
그리고 각 함수마다 아래와 같은 부분이 존재하는데 이 부분은 다음과 같다.
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//위
for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
//밑->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
//앞->밑
for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
해당 면에 대한 값들의 이동이 아니라 예를들어 초록색면을 돌린다고 했을때, 초록색면에 붙어있는 흰색부분과 빨간색 부분을 돌려주는 코드들이다.
이번문제는 큰 생각 없이 값들을 올바른 위치로 옮겨주는 코드들만 작성해주면 풀리는 문제다.
[전체 소스 코드]
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <set>
#define INF 987654321
#define mod 1000000007
#define pii pair<int,int>
#define MAX 7
#define ll long long
using namespace std;
//0=w, 1=y, 2=r, 3=or, 4=g, 5=b
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
vector<vector<vector<int>>> cube;
void left_clock()
{
//왼쪽면 = 4
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2-i] = cube[4][i][j];
cube[4] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//위
for (int i = 0; i < 3; i++) tmp2[i] = cube[0][i][0];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][0] = cube[3][i][2];
//밑->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][2] = cube[1][i][0];
//앞->밑
for (int i = 0; i < 3; i++) cube[1][i][0] = cube[2][i][0];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}
void left_reverse_clock()
{
//왼쪽면 = 4
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2-j][i] = cube[4][i][j];
cube[4] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][0];
//뒤->아래
for (int i = 0; i < 3; i++) cube[1][2-i][0] = cube[3][i][2];
//위->뒤
for (int i = 0; i < 3; i++) cube[3][2-i][2] = cube[0][i][0];
//앞->위
for (int i = 0; i < 3; i++) cube[0][i][0] = cube[2][i][0];
//아래->앞
for (int i = 0; i < 3; i++) cube[2][i][0] = tmp2[i];
}
void right_clock()
{
//오른쪽면 = 5
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[5][i][j];
cube[5] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
//뒤->아래
for (int i = 0; i < 3; i++) cube[1][2-i][2] = cube[3][i][0];
//위->뒤
for (int i = 0; i < 3; i++) cube[3][2 - i][0] = cube[0][i][2];
//앞->위
for (int i = 0; i < 3; i++) cube[0][i][2] = cube[2][i][2];
//아래->앞
for (int i = 0; i < 3; i++) cube[2][i][2] = tmp2[i];
}
void right_reverse_clock()
{
//오른쪽면 = 5
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2-j][i] = cube[5][i][j];
cube[5] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][i][2];
//앞->아래
for (int i = 0; i < 3; i++) cube[1][i][2] = cube[2][i][2];
//위->앞
for (int i = 0; i < 3; i++) cube[2][i][2] = cube[0][i][2];
//뒤->위
for (int i = 0; i < 3; i++) cube[0][2-i][2] = cube[3][i][0];
//아래->뒤
for (int i = 0; i < 3; i++) cube[3][2-i][0] = tmp2[i];
}
void front_clock()
{
//앞면 = 2
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[2][i][j];
cube[2] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
//오른->아래
for (int i = 0; i < 3; i++) cube[1][0][2-i] = cube[5][i][0];
//위->오른
for (int i = 0; i < 3; i++) cube[5][i][0] = cube[0][2][i];
//왼->위
for (int i = 0; i < 3; i++) cube[0][2][2-i] = cube[4][i][2];
//아래->왼
for (int i = 0; i < 3; i++) cube[4][i][2] = tmp2[i];
}
void front_reverse_clock()
{
//앞면 = 2
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[2][i][j];
cube[2] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][0][i];
//왼->아래
for (int i = 0; i < 3; i++) cube[1][0][i] = cube[4][i][2];
//위->왼
for (int i = 0; i < 3; i++) cube[4][2-i][2] = cube[0][2][i];
//오른->위
for (int i = 0; i < 3; i++) cube[0][2][i] = cube[5][i][0];
//아래->오른
for (int i = 0; i < 3; i++) cube[5][2-i][0] = tmp2[i];
}
void back_clock()
{
//뒷면 = 3
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[3][i][j];
cube[3] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][i];
//왼->아래
for (int i = 0; i < 3; i++) cube[1][2][i] = cube[4][i][0];
//위->왼
for (int i = 0; i < 3; i++) cube[4][2-i][0] = cube[0][0][i];
//오른->위
for (int i = 0; i < 3; i++) cube[0][0][i] = cube[5][i][2];
//아래->오른
for (int i = 0; i < 3; i++) cube[5][2-i][2] = tmp2[i];
}
void back_reverse_clock()
{
//뒷면 = 3
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[3][i][j];
cube[3] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//아래
for (int i = 0; i < 3; i++) tmp2[i] = cube[1][2][2 - i];
//오른->아래
for (int i = 0; i < 3; i++) cube[1][2][2 - i] = cube[5][i][2];
//위->오른
for (int i = 0; i < 3; i++) cube[5][i][2] = cube[0][0][i];
//왼->위
for (int i = 0; i < 3; i++) cube[0][0][2 - i] = cube[4][i][0];
//아래-왼
for (int i = 0; i < 3; i++) cube[4][2 - i][0] = tmp2[i];
}
void up_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[0][i][j];
cube[0] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
//오른->앞
for (int i = 0; i < 3; i++) cube[2][0][i] = cube[5][0][i];
//뒤->오른
for (int i = 0; i < 3; i++) cube[5][0][i] = cube[3][0][i];
//왼->뒤
for (int i = 0; i < 3; i++) cube[3][0][i] = cube[4][0][i];
//앞->왼
for (int i = 0; i < 3; i++) cube[4][0][i] = tmp2[i];
}
void up_reverse_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[0][i][j];
cube[0] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][0][i];
//왼->앞
for (int i = 0; i < 3; i++) cube[2][0][i] = cube[4][0][i];
//뒤->왼
for (int i = 0; i < 3; i++) cube[4][0][i] = cube[3][0][i];
//오른->뒤
for (int i = 0; i < 3; i++) cube[3][0][i] = cube[5][0][i];
//앞->오른
for (int i = 0; i < 3; i++) cube[5][0][i] = tmp2[i];
}
void down_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[j][2 - i] = cube[1][i][j];
cube[1] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
//왼->앞
for (int i = 0; i < 3; i++) cube[2][2][i] = cube[4][2][i];
//뒤->왼
for (int i = 0; i < 3; i++) cube[4][2][i] = cube[3][2][i];
//오른->뒤
for (int i = 0; i < 3; i++) cube[3][2][i] = cube[5][2][i];
//앞->오른
for (int i = 0; i < 3; i++) cube[5][2][i] = tmp2[i];
}
void down_reverse_clock()
{
//윗면 = 0
vector<vector<int>> tmp;
tmp.resize(3); for (int i = 0; i < 3; i++) tmp[i].resize(3);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
tmp[2 - j][i] = cube[1][i][j];
cube[1] = tmp;
vector<int> tmp2(3, 0);
//인덱스 기준 0=위, 1=아래, 2=앞, 3=뒤, 4=왼, 5오
//앞
for (int i = 0; i < 3; i++) tmp2[i] = cube[2][2][i];
//오른->앞
for (int i = 0; i < 3; i++) cube[2][2][i] = cube[5][2][i];
//뒤->오른
for (int i = 0; i < 3; i++) cube[5][2][i] = cube[3][2][i];
//왼->뒤
for (int i = 0; i < 3; i++) cube[3][2][i] = cube[4][2][i];
//앞->왼
for (int i = 0; i < 3; i++) cube[4][2][i] = tmp2[i];
}
void print_cube()
{
for (int j = 0; j < 3; j++)
{
for (int h = 0; h < 3; h++)
{
int color = cube[0][j][h];
if (color == 0) cout << "w";
else if (color == 1) cout << "y";
else if (color == 2) cout << "r";
else if (color == 3) cout << "o";
else if (color == 4) cout << "g";
else if (color == 5) cout << "b";
}
cout << "\n";
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cube.resize(6);
for (int i = 0; i < 6; i++)
{
cube[i].resize(3);
for (int j = 0; j < 3; j++)
cube[i][j].resize(3);
}
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 3; j++)
for (int h = 0; h < 3; h++)
cube[i][j][h] = i;
}
int T;
cin >> T;
while (T--)
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 3; j++)
for (int h = 0; h < 3; h++)
cube[i][j][h] = i;
}
int op_cnt;
cin >> op_cnt;
for (int i = 0; i < op_cnt; i++)
{
string op;
cin >> op;
if (op[0] == 'U')
{
if (op[1] == '+')
up_clock();
else
up_reverse_clock();
}
else if (op[0] == 'D')
{
if (op[1] == '+')
down_clock();
else
down_reverse_clock();
}
else if (op[0] == 'F')
{
if (op[1] == '+')
front_clock();
else
front_reverse_clock();
}
else if (op[0] == 'B')
{
if (op[1] == '+')
back_clock();
else
back_reverse_clock();
}
else if (op[0] == 'L')
{
if (op[1] == '+')
left_clock();
else
left_reverse_clock();
}
else if (op[0] == 'R')
{
if (op[1] == '+')
right_clock();
else
right_reverse_clock();
}
}
print_cube();
}
}

굳
'BOJ 풀이' 카테고리의 다른 글
[BOJ/백준 17245/C++] 서버실 (0) | 2024.11.29 |
---|---|
[BOJ/백준 9328/C++] 열쇠 (0) | 2023.04.13 |
[BOJ/백준 7578/C++] 공장 (0) | 2023.03.28 |
[BOJ/백준 2243/C++] 사탕상자 (0) | 2023.03.28 |
[BOJ/백준 2042/C++] 구간 합 구하기 (0) | 2023.03.23 |