본문 바로가기

코딩테스트 연습/백준

[ 백준 / 5373번 ] Gold I - 큐빙 ; Solved by Java

www.acmicpc.net/problem/5373

 

5373번: 큐빙

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

www.acmicpc.net

문제

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

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

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

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

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

입력

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

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

출력

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

 

[ 풀이 코드 ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 큐빙 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		StringBuilder sb  = new StringBuilder();
		for(int tc = 1; tc<=T;tc++) {
			char[][] U = {{'w','w','w'},{'w','w','w'},{'w','w','w'}};
			char[][] D = {{'y','y','y'},{'y','y','y'},{'y','y','y'}};
			char[][] F = {{'r','r','r'},{'r','r','r'},{'r','r','r'}};
			char[][] B = {{'o','o','o'},{'o','o','o'},{'o','o','o'}};
			char[][] L = {{'g','g','g'},{'g','g','g'},{'g','g','g'}};
			char[][] R = {{'b','b','b'},{'b','b','b'},{'b','b','b'}};
			int N = Integer.parseInt(br.readLine());
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int n=0; n<N; n++) { //나오는 단어 길이 
				char[] C = st.nextToken().toCharArray();
				switch(C[0]) {
				case 'U':
					//char[] TMP = {B[2][0],B[2][1],B[2][2]};
					if(C[1]=='+') { // 시계방향  
						char a = U[0][0], b = U[1][0];
						U[0][0]=U[2][0];
						U[1][0]=U[2][1];
						U[2][0]=U[2][2];
						U[2][1]=U[1][2];
						U[2][2]=U[0][2];
						U[1][2]=U[0][1];
						U[0][2]=a;
						U[0][1]=b;
						char[] TMP = {B[2][0],B[2][1],B[2][2]};
						B[2][0]=L[2][0];B[2][1]=L[2][1];B[2][2]=L[2][2];
						L[2][0]=F[0][2];L[2][1]=F[0][1];L[2][2]=F[0][0];
						F[0][2]=R[0][2];F[0][1]=R[0][1];F[0][0]=R[0][0];
						R[0][2]=TMP[0];R[0][1]=TMP[1];R[0][0]=TMP[2];
						break;
					}else {
						char a = U[0][0], b= U[0][1];
						U[0][0] = U[0][2];
						U[0][1]=U[1][2];
						U[0][2]=U[2][2];
						U[1][2]=U[2][1];
						U[2][2]=U[2][0];
						U[2][1]=U[1][0];
						U[2][0]=a;
						U[1][0]=b;
						char[] TMP = {B[2][0],B[2][1],B[2][2]};
						B[2][0]=R[0][2];B[2][1]=R[0][1];B[2][2]=R[0][0];
						R[0][2]=F[0][2];R[0][1]=F[0][1];R[0][0]=F[0][0];
						F[0][2]=L[2][0];F[0][1]=L[2][1];F[0][0]=L[2][2];
						L[2][0]=TMP[0];L[2][1]=TMP[1];L[2][2]=TMP[2];
						break;
					}
				case 'F':
					if(C[1]=='+') {
						char a = F[0][0], b = F[1][0];
						F[0][0]=F[2][0];
						F[1][0]=F[2][1];
						F[2][0]=F[2][2];
						F[2][1]=F[1][2];
						F[2][2]=F[0][2];
						F[1][2]=F[0][1];
						F[0][2]=a;
						F[0][1]=b;
						char[]TMP = {U[2][0],U[2][1],U[2][2]};
						U[2][0]=L[0][0];U[2][1]=L[1][0];U[2][2]=L[2][0];
						L[0][0]=D[0][2];L[1][0]=D[0][1];L[2][0]=D[0][0];
						D[0][2]=R[0][0];D[0][1]=R[1][0];D[0][0]=R[2][0];
						R[0][0]=TMP[0];R[1][0]=TMP[1];R[2][0]=TMP[2];
						break;
					}else {
						char a = F[0][0], b= F[0][1];
						F[0][0] = F[0][2];
						F[0][1]=F[1][2];
						F[0][2]=F[2][2];
						F[1][2]=F[2][1];
						F[2][2]=F[2][0];
						F[2][1]=F[1][0];
						F[2][0]=a;
						F[1][0]=b;
						char[]TMP = {U[2][0],U[2][1],U[2][2]};
						U[2][0]=R[0][0];U[2][1]=R[1][0];U[2][2]=R[2][0];
						R[0][0]=D[0][2];R[1][0]=D[0][1];R[2][0]=D[0][0];
						D[0][2]=L[0][0];D[0][1]=L[1][0];D[0][0]=L[2][0];
						L[0][0]=TMP[0];L[1][0]=TMP[1];L[2][0]=TMP[2];
						break;
					}
				case 'D':
					if(C[1]=='+') {
						char a = D[0][0], b = D[1][0];
						D[0][0]=D[2][0];
						D[1][0]=D[2][1];
						D[2][0]=D[2][2];
						D[2][1]=D[1][2];
						D[2][2]=D[0][2];
						D[1][2]=D[0][1];
						D[0][2]=a;
						D[0][1]=b;
						char[] TMP = {F[2][0],F[2][1],F[2][2]};
						F[2][0]=L[0][2];F[2][1]=L[0][1];F[2][2]=L[0][0];
						L[0][2]=B[0][2];L[0][1]=B[0][1];L[0][0]=B[0][0];
						B[0][2]=R[2][0];B[0][1]=R[2][1];B[0][0]=R[2][2];
						R[2][0]=TMP[0];R[2][1]=TMP[1];R[2][2]=TMP[2];
						break;
					}else {
						char a = D[0][0], b= D[0][1];
						D[0][0] = D[0][2];
						D[0][1]=D[1][2];
						D[0][2]=D[2][2];
						D[1][2]=D[2][1];
						D[2][2]=D[2][0];
						D[2][1]=D[1][0];
						D[2][0]=a;
						D[1][0]=b;
						char[] TMP = {F[2][0],F[2][1],F[2][2]};
						F[2][0]=R[2][0];F[2][1]=R[2][1];F[2][2]=R[2][2];
						R[2][0]=B[0][2];R[2][1]=B[0][1];R[2][2]=B[0][0];
						B[0][2]=L[0][2];B[0][1]=L[0][1];B[0][0]=L[0][0];
						L[0][2]=TMP[0];L[0][1]=TMP[1];L[0][0]=TMP[2];
						
						break;
					}
				case 'B':
					if(C[1]=='+') {
						char a = B[0][0], b = B[1][0];
						B[0][0]=B[2][0];
						B[1][0]=B[2][1];
						B[2][0]=B[2][2];
						B[2][1]=B[1][2];
						B[2][2]=B[0][2];
						B[1][2]=B[0][1];
						B[0][2]=a;
						B[0][1]=b;
						char[] TMP = {D[2][0],D[2][1],D[2][2]};
						D[2][0]=L[2][2];D[2][1]=L[1][2];D[2][2]=L[0][2];
						L[2][2]=U[0][2];L[1][2]=U[0][1];L[0][2]=U[0][0];
						U[0][2]=R[2][2];U[0][1]=R[1][2];U[0][0]=R[0][2];
						R[2][2]=TMP[0];R[1][2]=TMP[1];R[0][2]=TMP[2];
						break;
					}else {
						char a = B[0][0], b= B[0][1];
						B[0][0] = B[0][2];
						B[0][1]=B[1][2];
						B[0][2]=B[2][2];
						B[1][2]=B[2][1];
						B[2][2]=B[2][0];
						B[2][1]=B[1][0];
						B[2][0]=a;
						B[1][0]=b;
						char[] TMP = {D[2][0],D[2][1],D[2][2]};
						D[2][0]=R[2][2];D[2][1]=R[1][2];D[2][2]=R[0][2];
						R[2][2]=U[0][2];R[1][2]=U[0][1];R[0][2]=U[0][0];
						U[0][2]=L[2][2];U[0][1]=L[1][2];U[0][0]=L[0][2];
						L[2][2]=TMP[0];L[1][2]=TMP[1];L[0][2]=TMP[2];
						break;
					}
				case 'L':
					if(C[1]=='+') {
						char a = L[0][0], b = L[1][0];
						L[0][0]=L[2][0];
						L[1][0]=L[2][1];
						L[2][0]=L[2][2];
						L[2][1]=L[1][2];
						L[2][2]=L[0][2];
						L[1][2]=L[0][1];
						L[0][2]=a;
						L[0][1]=b;
						char[] TMP = {D[0][0],D[1][0],D[2][0]};
						D[0][0]=F[0][0];D[1][0]=F[1][0];D[2][0]=F[2][0];
						F[0][0]=U[0][0];F[1][0]=U[1][0];F[2][0]=U[2][0];
						U[0][0]=B[0][0];U[1][0]=B[1][0];U[2][0]=B[2][0];
						B[0][0]=TMP[0];B[1][0]=TMP[1];B[2][0]=TMP[2];
						break;
					}else {
						char a = L[0][0], b= L[0][1];
						L[0][0] = L[0][2];
						L[0][1]=L[1][2];
						L[0][2]=L[2][2];
						L[1][2]=L[2][1];
						L[2][2]=L[2][0];
						L[2][1]=L[1][0];
						L[2][0]=a;
						L[1][0]=b;
						char[] TMP ={D[0][0],D[1][0],D[2][0]};
						D[0][0]=B[0][0];D[1][0]=B[1][0];D[2][0]=B[2][0];
						B[0][0]=U[0][0];B[1][0]=U[1][0];B[2][0]=U[2][0];
						U[0][0]=F[0][0];U[1][0]=F[1][0];U[2][0]=F[2][0];
						F[0][0]=TMP[0];F[1][0]=TMP[1];F[2][0]=TMP[2];
						break;
					}
				case 'R':
					if(C[1]=='+') {
						char a = R[0][0], b = R[1][0];
						R[0][0]=R[2][0];
						R[1][0]=R[2][1];
						R[2][0]=R[2][2];
						R[2][1]=R[1][2];
						R[2][2]=R[0][2];
						R[1][2]=R[0][1];
						R[0][2]=a;
						R[0][1]=b;
						char[] TMP = {U[2][2],U[1][2],U[0][2]};
						U[2][2]=F[2][2];U[1][2]=F[1][2];U[0][2]=F[0][2];
						F[2][2]=D[2][2];F[1][2]=D[1][2];F[0][2]=D[0][2];
						D[2][2]=B[2][2];D[1][2]=B[1][2];D[0][2]=B[0][2];
						B[2][2]=TMP[0];B[1][2]=TMP[1];B[0][2]=TMP[2];
						break;
					}else {
						char a = R[0][0], b= R[0][1];
						R[0][0] = R[0][2];
						R[0][1]=R[1][2];
						R[0][2]=R[2][2];
						R[1][2]=R[2][1];
						R[2][2]=R[2][0];
						R[2][1]=R[1][0];
						R[2][0]=a;
						R[1][0]=b;
						char[] TMP ={U[2][2],U[1][2],U[0][2]};
						U[2][2]=B[2][2];U[1][2]=B[1][2];U[0][2]=B[0][2];
						B[2][2]=D[2][2];B[1][2]=D[1][2];B[0][2]=D[0][2];
						D[2][2]=F[2][2];D[1][2]=F[1][2];D[0][2]=F[0][2];
						F[2][2]=TMP[0];F[1][2]=TMP[1];F[0][2]=TMP[2];
						break;
					}
				}
				
			}
			sb.append(U[0][0]).append(U[0][1]).append(U[0][2]).append('\n');
			sb.append(U[1][0]).append(U[1][1]).append(U[1][2]).append('\n');
			sb.append(U[2][0]).append(U[2][1]).append(U[2][2]).append('\n');
		}
		System.out.println(sb);
	}
}

 

[ 풀이 ]

진짜 이 문제 하나 푼다고 몇번을 갈아 엎엇는지 모르겠다.. 이 문제 풀때 가장 중요한것은 눈으로 봤을 때 헷갈리지 않게  코드를 짜는 것이다 너무 길고 난리나서 진짜 못풀겠다...

알고리즘 자체가 어려운건 아니다 말 그대로 진짜 gold 1급의 으려움...

이 부분이 시계방향으로 회전하는 건데 명확하게 헷갈리지 않게 순서대로 이루어지도록 또박 또박 쓰고, 이거를 계속 복붙한다. 

그리고 다음 부분이 이제 옆에 있는 값들도 이동시켜주는 건데, 

진짜 절대 헷갈리지 않게 형식에 꼭꼭 맞춰서 정해두고, 그대로 따르게 코드를 짠다. 

나는 거의 위를 쓰면 아래도 쓸 수 있게끔 코드를 짜놨다.

그리고 이제 순서에 따라서 뱅글 뱅글 돌면서 계산하면 되는데, 

풀이에 이용했던 그림을 첨부한다. 

후... 이런식으로 코딩하면 된다.. 진짜 여기서 틀리는 이유는 

무조건 오탄데 그 오타를 찾기가 진짜 너무 너무 힘이 든다.. 차라리 다시 형식 맞춰서 싹다 

코딩 새로 하는게 낫다..