SAMSUNG/삼성 SW 역량 테스트 준비

[백준 5373번] 큐빙 (Java)

sanadoing_ 2024. 4. 8. 13:56
728x90

> 자바, 구현, 시뮬레이션

 

 

 

 

 

📖 문제 : 큐빙 (Java)

 

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

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

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

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

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

 

입력

 

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

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

 

출력

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

 

예제 입력 1 

4
1
L-
2
F+ B+
4
U- D- L+ R+
10
L- U- L+ U- L- U- U- L+ U+ U+

 

예제 출력 1 

rww
rww
rww
bbb
www
ggg
gwg
owr
bwb
gwo
www
rww
 

 

 

내 코드

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

public class B_5373 {

	static char[] Qube, colors;
	static int[][] change;
	static StringTokenizer st;

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int T = Integer.parseInt(br.readLine());
		for (int t = 1; t <= T; t++) {
			int N = Integer.parseInt(br.readLine());

			// 큐브 초기화
			Qube = new char[] { 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g',
					'g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'o',
					'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y' };
			colors = new char[] { 'w', 'g', 'r', 'b', 'o', 'y' };

			int colorIdx = 0;
			int idx = 0;

			change = new int[][] { { 38, 37, 36, 29, 28, 27, 20, 19, 18, 11, 10, 9 }, // U - w (흰)
					{ 0, 3, 6, 18, 21, 24, 45, 48, 51, 44, 41, 38 }, // L - g (초록)
					{ 6, 7, 8, 27, 30, 33, 47, 46, 45, 17, 14, 11 }, // F - r (빨간)
					{ 8, 5, 2, 36, 39, 42, 53, 50, 47, 26, 23, 20 }, // R - b (파란)
					{ 2, 1, 0, 9, 12, 15, 51, 52, 53, 35, 32, 29 }, // B - o (오렌지)
					{ 24, 25, 26, 33, 34, 35, 42, 43, 44, 15, 16, 17 } // D - y (노랑)
			};

			st = new StringTokenizer(br.readLine());

			for (int i = 0; i < N; i++) {
				String command = st.nextToken();
				char c = command.charAt(0); // U, L, F, R, B, D
				char d = command.charAt(1); // -, +

				int changeIdx = 0;
				int cnt;
				if (d == '+') {
					cnt = 1;
				} else {
					cnt = 3;
				}
				if (c == 'U') {
					changeIdx = 0;
				} else if (c == 'L') {
					changeIdx = 1;
				} else if (c == 'F') {
					changeIdx = 2;
				} else if (c == 'R') {
					changeIdx = 3;
				} else if (c == 'B') {
					changeIdx = 4;
				} else if (c == 'D') {
					changeIdx = 5;
				}

				change_qube(changeIdx, cnt);

			}
			for (int f = 0; f < 9; f++) {
				System.out.print(Qube[f]);
				if (f % 3 == 2) {
					System.out.println();
				}

			}
		}
	}

	static void change_qube(int changeIdx, int cnt) {

		for (int i = 0; i < cnt; i++) {

//			fourSide(changeIdx);
			// 다른 쪽 면 4방향의 1줄씩 회전
			char temp1 = Qube[change[changeIdx][9]];
			char temp2 = Qube[change[changeIdx][10]];
			char temp3 = Qube[change[changeIdx][11]];

			for (int j = 3; j > 0; j--) {
				Qube[change[changeIdx][j * 3 + 0]] = Qube[change[changeIdx][(j - 1) * 3 + 0]];
				Qube[change[changeIdx][j * 3 + 1]] = Qube[change[changeIdx][(j - 1) * 3 + 1]];
				Qube[change[changeIdx][j * 3 + 2]] = Qube[change[changeIdx][(j - 1) * 3 + 2]];
			}
			Qube[change[changeIdx][0]] = temp1;
			Qube[change[changeIdx][1]] = temp2;
			Qube[change[changeIdx][2]] = temp3;

//			fourSide(changeIdx);
//			nowSide(changeIdx);
			// 현재 해당하는 면 회전
			temp1 = Qube[changeIdx * 9 + 2];
			temp2 = Qube[changeIdx * 9 + 1];
			temp3 = Qube[changeIdx * 9];

			Qube[changeIdx * 9 + 2] = Qube[changeIdx * 9];
			Qube[changeIdx * 9 + 1] = Qube[changeIdx * 9 + 3];
			Qube[changeIdx * 9] = Qube[changeIdx * 9 + 6];

			Qube[changeIdx * 9] = Qube[changeIdx * 9 + 6];
			Qube[changeIdx * 9 + 3] = Qube[changeIdx * 9 + 7];
			Qube[changeIdx * 9 + 6] = Qube[changeIdx * 9 + 8];

			Qube[changeIdx * 9 + 6] = Qube[changeIdx * 9 + 8];
			Qube[changeIdx * 9 + 7] = Qube[changeIdx * 9 + 5];
			Qube[changeIdx * 9 + 8] = Qube[changeIdx * 9 + 2];

			Qube[changeIdx * 9 + 8] = temp1;
			Qube[changeIdx * 9 + 5] = temp2;
			Qube[changeIdx * 9 + 2] = temp3;

//			nowSide(changeIdx);

		}

	}

//	static void nowSide(int changeIdx) {
//		System.out.println("====nowSide====");
//		for (int f = 0; f < 9; f++) {
//			System.out.print(Qube[9 * changeIdx + f]);
//			if (f % 3 == 2) {
//				System.out.println();
//			}
//
//		}
//		System.out.println("========");
//	}
//
//	static void fourSide(int changeIdx) {
//		System.out.println("====fourSide====");
//		for (int f = 0; f < 12; f++) {
//			System.out.print(Qube[change[changeIdx][f]]);
//
//		}
//		System.out.println("========");
//	}

}

 

 

 

 

Point ! ⭐️

  • 꼼꼼히 !!

 

 

 

 

 

 

 

 

백준

https://www.acmicpc.net/problem/5373

 

5373번: 큐빙

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

www.acmicpc.net

 

728x90