[백준/BOJ] 백준 5373번 : 큐빙

2020. 12. 28. 20:58알고리즘 문제풀이

www.acmicpc.net/problem/5373

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

큐브의 면을 돌렸을 때 어떻게 변하는지를 설정해 놓는다. 해당 면을 돌릴 때 어떻게 변하는지 설정하기 위해 해당 면에 접해있는 4개의 줄들이 변하는 것과, 해당 면이 회전하는 것을 고려한다. 

 

코드

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

int tc;
int n;
char cube[6][3][3];

//큐브 초기화
void Pre()
{
	for (int i = 0; i < 6; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				if (i == 0)
					cube[i][j][k] = 'w';
				else if (i == 1)
					cube[i][j][k] = 'y';
				else if (i == 2)
					cube[i][j][k] = 'r';
				else if (i == 3)
					cube[i][j][k] = 'o';
				else if (i == 4)
					cube[i][j][k] = 'g';
				else if (i == 5)
					cube[i][j][k] = 'b';
			}
		}
	}
}

//해당 면 회전
void TurnThisDir(int dir, char clock)
{
	char temp1 = cube[dir][0][0];
	char temp2 = cube[dir][1][0];
	char temp3 = cube[dir][2][0];
	char temp4 = cube[dir][2][1];
	char temp5 = cube[dir][2][2];
	char temp6 = cube[dir][1][2];
	char temp7 = cube[dir][0][2];
	char temp8 = cube[dir][0][1];

	if (clock == '+')
	{

		cube[dir][0][0] = temp3;
		cube[dir][0][1] = temp2;
		cube[dir][0][2] = temp1;
		cube[dir][1][0] = temp4;
		cube[dir][1][2] = temp8;
		cube[dir][2][0] = temp5;
		cube[dir][2][1] = temp6;
		cube[dir][2][2] = temp7;
	}

	else
	{
		cube[dir][0][0] = temp7;
		cube[dir][0][1] = temp6;
		cube[dir][0][2] = temp5;
		cube[dir][1][0] = temp8;
		cube[dir][1][2] = temp4;
		cube[dir][2][0] = temp1;
		cube[dir][2][1] = temp2;
		cube[dir][2][2] = temp3;
	}

}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> tc;

	for (int t = 0; t < tc; t++)
	{
		Pre();

		cin >> n;

		for (int i = 0; i < n; i++)
		{
			string turn;
			char temp[3];

			cin >> turn;

			//윗면일때
			if (turn[0] == 'U')
			{
				temp[0] = cube[2][0][0];
				temp[1] = cube[2][0][1];
				temp[2] = cube[2][0][2];

				//해당면 옆에 4줄 회전(시계 방향)
				if (turn[1] == '+')
				{
					cube[2][0][0] = cube[5][0][0];
					cube[2][0][1] = cube[5][0][1];
					cube[2][0][2] = cube[5][0][2];

					cube[5][0][0] = cube[3][0][0];
					cube[5][0][1] = cube[3][0][1];
					cube[5][0][2] = cube[3][0][2];

					cube[3][0][0] = cube[4][0][0];
					cube[3][0][1] = cube[4][0][1];
					cube[3][0][2] = cube[4][0][2];

					cube[4][0][0] = temp[0];
					cube[4][0][1] = temp[1];
					cube[4][0][2] = temp[2];
				}
				
				//해당면 옆에 4줄 회전(반시계 방향)
				else if (turn[1] == '-')
				{
					cube[2][0][0] = cube[4][0][0];
					cube[2][0][1] = cube[4][0][1];
					cube[2][0][2] = cube[4][0][2];

					cube[4][0][0] = cube[3][0][0];
					cube[4][0][1] = cube[3][0][1];
					cube[4][0][2] = cube[3][0][2];

					cube[3][0][0] = cube[5][0][0];
					cube[3][0][1] = cube[5][0][1];
					cube[3][0][2] = cube[5][0][2];

					cube[5][0][0] = temp[0];
					cube[5][0][1] = temp[1];
					cube[5][0][2] = temp[2];
				}

				//해당 면 회전
				TurnThisDir(0, turn[1]);
			}

			if (turn[0] == 'D')
			{
				temp[0] = cube[2][2][0];
				temp[1] = cube[2][2][1];
				temp[2] = cube[2][2][2];

				if (turn[1] == '+')
				{
					cube[2][2][0] = cube[4][2][0];
					cube[2][2][1] = cube[4][2][1];
					cube[2][2][2] = cube[4][2][2];

					cube[4][2][0] = cube[3][2][0];
					cube[4][2][1] = cube[3][2][1];
					cube[4][2][2] = cube[3][2][2];

					cube[3][2][0] = cube[5][2][0];
					cube[3][2][1] = cube[5][2][1];
					cube[3][2][2] = cube[5][2][2];

					cube[5][2][0] = temp[0];
					cube[5][2][1] = temp[1];
					cube[5][2][2] = temp[2];
				}

				else if (turn[1] == '-')
				{
					cube[2][2][0] = cube[5][2][0];
					cube[2][2][1] = cube[5][2][1];
					cube[2][2][2] = cube[5][2][2];

					cube[5][2][0] = cube[3][2][0];
					cube[5][2][1] = cube[3][2][1];
					cube[5][2][2] = cube[3][2][2];

					cube[3][2][0] = cube[4][2][0];
					cube[3][2][1] = cube[4][2][1];
					cube[3][2][2] = cube[4][2][2];

					cube[4][2][0] = temp[0];
					cube[4][2][1] = temp[1];
					cube[4][2][2] = temp[2];
				}

				TurnThisDir(1, turn[1]);
			}

			if (turn[0] == 'F')
			{
				temp[0] = cube[0][2][0];
				temp[1] = cube[0][2][1];
				temp[2] = cube[0][2][2];

				if (turn[1] == '+')
				{
					cube[0][2][0] = cube[4][2][2];
					cube[0][2][1] = cube[4][1][2];
					cube[0][2][2] = cube[4][0][2];

					cube[4][0][2] = cube[1][0][0];
					cube[4][1][2] = cube[1][0][1];
					cube[4][2][2] = cube[1][0][2];

					cube[1][0][0] = cube[5][2][0];
					cube[1][0][1] = cube[5][1][0];
					cube[1][0][2] = cube[5][0][0];

					cube[5][2][0] = temp[2];
					cube[5][1][0] = temp[1];
					cube[5][0][0] = temp[0];
				}

				else if (turn[1] == '-')
				{
					cube[0][2][0] = cube[5][0][0];
					cube[0][2][1] = cube[5][1][0];
					cube[0][2][2] = cube[5][2][0];

					cube[5][0][0] = cube[1][0][2];
					cube[5][1][0] = cube[1][0][1];
					cube[5][2][0] = cube[1][0][0];

					cube[1][0][0] = cube[4][0][2];
					cube[1][0][1] = cube[4][1][2];
					cube[1][0][2] = cube[4][2][2];

					cube[4][0][2] = temp[2];
					cube[4][1][2] = temp[1];
					cube[4][2][2] = temp[0];
				}

				TurnThisDir(2, turn[1]);
			}

			if (turn[0] == 'B')
			{
				temp[0] = cube[0][0][0];
				temp[1] = cube[0][0][1];
				temp[2] = cube[0][0][2];

				if (turn[1] == '+')
				{
					cube[0][0][0] = cube[5][0][2];
					cube[0][0][1] = cube[5][1][2];
					cube[0][0][2] = cube[5][2][2];

					cube[5][0][2] = cube[1][2][2];
					cube[5][1][2] = cube[1][2][1];
					cube[5][2][2] = cube[1][2][0];

					cube[1][2][0] = cube[4][0][0];
					cube[1][2][1] = cube[4][1][0];
					cube[1][2][2] = cube[4][2][0];

					cube[4][0][0] = temp[2];
					cube[4][1][0] = temp[1];
					cube[4][2][0] = temp[0];
				}

				else if (turn[1] == '-')
				{
					cube[0][0][0] = cube[4][2][0];
					cube[0][0][1] = cube[4][1][0];
					cube[0][0][2] = cube[4][0][0];

					cube[4][0][0] = cube[1][2][0];
					cube[4][1][0] = cube[1][2][1];
					cube[4][2][0] = cube[1][2][2];

					cube[1][2][0] = cube[5][2][2];
					cube[1][2][1] = cube[5][1][2];
					cube[1][2][2] = cube[5][0][2];

					cube[5][2][2] = temp[2];
					cube[5][1][2] = temp[1];
					cube[5][0][2] = temp[0];
				}

				TurnThisDir(3, turn[1]);
			}

			if (turn[0] == 'L')
			{
				temp[0] = cube[0][0][0];
				temp[1] = cube[0][1][0];
				temp[2] = cube[0][2][0];

				if (turn[1] == '+')
				{
					cube[0][0][0] = cube[3][2][2];
					cube[0][1][0] = cube[3][1][2];
					cube[0][2][0] = cube[3][0][2];

					cube[3][0][2] = cube[1][2][0];
					cube[3][1][2] = cube[1][1][0];
					cube[3][2][2] = cube[1][0][0];

					cube[1][0][0] = cube[2][0][0];
					cube[1][1][0] = cube[2][1][0];
					cube[1][2][0] = cube[2][2][0];

					cube[2][0][0] = temp[0];
					cube[2][1][0] = temp[1];
					cube[2][2][0] = temp[2];
				}

				else if (turn[1] == '-')
				{
					cube[0][0][0] = cube[2][0][0];
					cube[0][1][0] = cube[2][1][0];
					cube[0][2][0] = cube[2][2][0];

					cube[2][0][0] = cube[1][0][0];
					cube[2][1][0] = cube[1][1][0];
					cube[2][2][0] = cube[1][2][0];

					cube[1][0][0] = cube[3][2][2];
					cube[1][1][0] = cube[3][1][2];
					cube[1][2][0] = cube[3][0][2];

					cube[3][2][2] = temp[0];
					cube[3][1][2] = temp[1];
					cube[3][0][2] = temp[2];
				}

				TurnThisDir(4, turn[1]);
			}

			if (turn[0] == 'R')
			{

				temp[0] = cube[0][0][2];
				temp[1] = cube[0][1][2];
				temp[2] = cube[0][2][2];

				if (turn[1] == '+')
				{
					cube[0][0][2] = cube[2][0][2];
					cube[0][1][2] = cube[2][1][2];
					cube[0][2][2] = cube[2][2][2];

					cube[2][0][2] = cube[1][0][2];
					cube[2][1][2] = cube[1][1][2];
					cube[2][2][2] = cube[1][2][2];

					cube[1][0][2] = cube[3][2][0];
					cube[1][1][2] = cube[3][1][0];
					cube[1][2][2] = cube[3][0][0];

					cube[3][2][0] = temp[0];
					cube[3][1][0] = temp[1];
					cube[3][0][0] = temp[2];
				}

				else if (turn[1] == '-')
				{
					cube[0][0][2] = cube[3][2][0];
					cube[0][1][2] = cube[3][1][0];
					cube[0][2][2] = cube[3][0][0];

					cube[3][2][0] = cube[1][0][2];
					cube[3][1][0] = cube[1][1][2];
					cube[3][0][0] = cube[1][2][2];

					cube[1][0][2] = cube[2][0][2];
					cube[1][1][2] = cube[2][1][2];
					cube[1][2][2] = cube[2][2][2];

					cube[2][0][2] = temp[0];
					cube[2][1][2] = temp[1];
					cube[2][2][2] = temp[2];
				}

				TurnThisDir(5, turn[1]);
			}
		}


		//윗면출력
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 3; j++)
				cout << cube[0][i][j];
			cout << "\n";
		}

	}


	return 0;
}