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
728x90
'SAMSUNG > 삼성 SW 역량 테스트 준비' 카테고리의 다른 글
[Java] 그래프 기본 템플릿 (0) | 2024.04.09 |
---|---|
[백준 20058번] 마법사 상어와 파이어스톰 (Java) (0) | 2024.04.08 |
[백준 23288번] 주사위 굴리기 2 (Python) (6) | 2023.10.14 |
[백준 21610번] 마법사 상어와 비바라기 (Python) (0) | 2023.10.14 |
[백준 14890번] 경사로 (Python) (0) | 2023.10.14 |