본문 바로가기

Algorithm

백준 5373번 큐빙 (삼성 기출)

반응형

문제

루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.

큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.

이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.

루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.

위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.

  • 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
  • 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.

출력

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.

 

 

하드코딩 문제였음..

그냥 처음에 각 면을 색 초기화 해주고, 각 케이스 별로 돌리는 경우를 만들어 주면되는데 주의 할 점은

배열이 어떻게 매핑되는가이다.

왼쪽 위 앞을 인덱스 0,1,2 라면 오른쪽, 아래 뒤는 2,1,0 순으로 접근 해 주어야 함.

사실 코딩이 완성된 소스는 아니지만 이 아이디어가 맞고 하드코딩 외의 방법이 없으므로 정답을 맞추기 위해 시간 낭비 안하도록 하겠음.

그냥 이런식으로 각 케이스 고려해서 인덱스만 잘 매핑해 주면된다.

 

 

#include<iostream>

using namespace std;
char arr[6][3][3];
char temp[6][3][3];


void init()
{
	
	
	for(int i = 0; i <6; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			for(int k = 0; k < 3; k++)
			{
					if( i == 0)
					{
						arr[i][j][k] = 'w';
					}
					else if(i == 1)
					{
						arr[i][j][k] = 'y';
					}
					else if(i == 2)
					{
						arr[i][j][k] = 'g';
					}
					else if(i == 3)
					{
						arr[i][j][k] = 'b';
					}
					else if(i == 4)
					{
						arr[i][j][k] = 'r';
					}
					else
					{
						arr[i][j][k] = 'o';
					}
			}
		}
	}
	
}

void copy()
{
	for(int i = 0; i <6; i++)
	{
		for(int j = 0; j < 3; j++)
		{
			for(int k = 0; k < 3; k++)
			{
			
				temp[i][j][k] = arr[i][j][k];
				
			}
		}
	}
	
}



int main(void)
{
	
	
	
	
	int N;
	cin >> N;
	for(int i = 0; i < N; i++)
	{
		init();
		
		int turn;
		cin >> turn;
		
		for(int j = 0; j < turn; j++)
		{
			string str;
			cin >> str;
			
			
			if(str[0] == 'U')
			{
				copy();
				if(str[1]=='-')
				{
					for(int k = 0; k <3; k++)
					{
						arr[5][0][k] = temp[3][0][k];
						arr[3][0][k] = temp[4][0][k];
						arr[4][0][k] = temp[2][0][k];
						arr[2][0][k] = temp[5][0][k];
						
						for(int l = 0; l < 3; l++)
						{
							arr[0][k][l] = temp[0][l][2-k];
						}	
					
					}
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[3][0][k] = temp[5][0][k];
						arr[4][0][k] = temp[3][0][k];
						arr[2][0][k] = temp[4][0][k];
						arr[5][0][k] = temp[2][0][k];
						for(int l = 2; l >= 0; l--)
						{
							arr[0][k][2-l] = temp[0][l][k];
						}	
						
					}
				
					
				}
			}
			else if(str[0] == 'D')
			{
				copy();
				if(str[1]=='-')
				{
					for(int k = 0; k <3; k++)
					{
						arr[3][2][k] = temp[5][2][k];
						arr[4][2][k] = temp[3][2][k];
						arr[2][2][k] = temp[4][2][k];
						arr[5][2][k] = temp[2][2][k];
						
						for(int l = 0; l < 3; l++)
						{
							arr[1][k][l] = temp[1][l][2-k];
						}	
					
					}
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[5][2][k] = temp[3][2][k];
						arr[3][2][k] = temp[4][2][k];
						arr[4][2][k] = temp[2][2][k];
						arr[2][2][k] = temp[5][2][k];
						for(int l = 2; l >= 0; l--)
						{
							arr[1][k][2-l] = temp[1][l][k];
						}	
					
					
					}
				}
				
			}
			else if(str[0] == 'L')
			{
				copy();
				if(str[1]=='-')
				{
					for(int k = 0; k <3; k++)
					{
						arr[0][k][0] = temp[4][k][0];
						arr[5][2-k][2] = temp[0][k][0];
						arr[1][k][0] = temp[5][k][2];
						arr[4][2-k][0] = temp[1][k][0];
						for(int l = 0; l < 3; l++)
						{
							arr[2][k][l] = temp[2][l][2-k];
						}	
						
					
					}
					
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[4][k][0] = temp[0][k][0];
						arr[0][k][0] = temp[5][2-k][2];
						arr[5][k][2] = temp[1][k][0];
						arr[1][k][0] = temp[4][2-k][0];
						
						for(int l = 2; l >= 0; l--)
						{
							arr[2][k][2-l] = temp[2][l][k];
						}	
						
					}
					
				}
			}
			else if(str[0] == 'R')
			{
				copy();
				if(str[1]=='-')
				{
					for(int k = 0; k <3; k++)
					{
						arr[4][k][2] = temp[0][k][2];
						arr[0][k][2] = temp[5][2-k][0];
						arr[5][k][0] = temp[1][k][2];
						arr[1][k][2] = temp[4][2-k][2];
						
						for(int l = 0; l < 3; l++)
						{
							arr[3][k][l] = temp[3][l][2-k];
						}	
					
					}
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[0][k][2] = temp[4][k][2];
						arr[5][2-k][0] = temp[0][k][2];
						arr[1][k][2] = temp[5][k][0];
						arr[4][2-k][2] = temp[1][k][2];
						
						for(int l = 2; l >= 0; l--)
						{
							arr[3][k][2-l] = temp[3][l][k];
						}	
						
					}
				}
			}
			else if(str[0] == 'F')
			{
				copy();
				if(str[1]=='-')
				{
					for(int k = 0; k <3; k++)
					{
						arr[0][2][k] = temp[3][k][0];
						arr[2][2-k][2] = temp[0][2][k];
						arr[1][2][k] = temp[2][k][2];
						arr[3][2-k][0] = temp[1][2][k];
						
						for(int l = 0; l < 3; l++)
						{
							arr[4][k][l] = temp[4][l][2-k];
						}	
					
					}
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[3][k][0] = temp[0][2][k];
						arr[0][2][k] = temp[2][2-k][2];
						arr[2][k][2] = temp[1][2][k];
						arr[1][2][k] = temp[3][2-k][0];
						
						for(int l = 2; l >= 0; l--)
						{
							arr[4][k][2-l] = temp[4][l][k];
						}	
						
					}
					
				}
			}
			else if(str[0] == 'B')
			{
				copy();
				if(str[1]=='-')
				{
					
					for(int k = 0; k <3; k++)
					{
						arr[3][k][2] = temp[0][0][k];
						arr[0][0][k] = temp[2][2-k][0];
						arr[2][k][0] = temp[1][0][k];
						arr[1][0][k] = temp[3][2-k][2];
						
						for(int l = 0; l < 3; l++)
						{
							arr[5][k][l] = temp[5][l][2-k];
						}	
						
					}
					
				}
				else if(str[1]=='+')
				{
					for(int k = 0; k <3; k++)
					{
						arr[0][0][k] = temp[3][k][2];
						arr[2][2-k][0] = temp[0][0][k];
						arr[1][0][k] = temp[2][k][0];
						arr[3][2-k][2] = temp[1][0][k];
						
						for(int l = 2; l >= 0; l--)
						{
							arr[5][k][2-l] = temp[5][l][k];
						}	
					
					}
					
				}
			}
		
		}
		
	
				for(int i = 0; i <3; i++)
				{
					for(int j = 0; j < 3; j++)
					{
						cout << arr[0][i][j] <<" ";
					}
					cout << endl; 
				}
	
		
		
		
	}
	
	

	
	
	
	
	
	
}
반응형