문제 >
루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.
큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.
이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.
루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.
위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.
입력 >
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.
- 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
- 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.
출력 >
각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.
해결방법 >
시뮬레이션 문제다. 큐브를 [6][3][3] 배열에 담아서 각 입력에 따른 동작을 수행하는 프로그램을 만드는건데...
진짜 어렵다는 것보다 힘들었던 문제였다..
입력에 따라 큐브의 한 면이 돌아가고 이 때, 인접한 네 면의 한 줄이 시계방향 또는 반 시계방향으로 넘어간다.
자세한 동작 방식은 아래와 같다.
여기까지 구현하면 되는 줄 알았는데 가장 중요한 부분을 잊고 있었다.
큐브를 돌린 면의 행과 열이 시계방향 또는 반시계 방향으로 바뀐다는 점이다.
이 점을 빠뜨린지도 모른채 배열의 인덱스를 잘 못 넣었나 몇 시간을 찾았다....
머리때문에 몸이 고생했다.
[JAVA]
package baekjoon;
import java.util.*;
import java.io.*;
public class BOJ_5373 {
static char[][][] cube = new char[6][3][3];
public static void init() {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
cube[0][i][j] = 'w';
cube[1][i][j] = 'r';
cube[2][i][j] = 'y';
cube[3][i][j] = 'o';
cube[4][i][j] = 'g';
cube[5][i][j] = 'b';
}
}
}
public static char[][] set(char[][] face, char d) {
char[][] nface = new char[3][3];
if(d == '+') {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
nface[j][2-i] = face[i][j];
}
}
}
else {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
nface[2-j][i] = face[i][j];
}
}
}
return nface;
}
public static void turn(String s) {
char op = s.charAt(0);
char d = s.charAt(1);
if(op == 'U') {
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[4][i][2];
cube[4][i][2] = cube[1][0][i];
cube[1][0][i] = cube[5][2-i][0];
cube[5][2-i][0] = cube[3][2][2-i];
cube[3][2][2-i] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[3][2][2-i];
cube[3][2][2-i] = cube[5][2-i][0];
cube[5][2-i][0] = cube[1][0][i];
cube[1][0][i] = cube[4][i][2];
cube[4][i][2] = tmp;
}
}
cube[0] = set(cube[0], d);
}
else if(op == 'D'){
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[4][2-i][0];
cube[4][2-i][0] = cube[3][0][i];
cube[3][0][i] = cube[5][i][2];
cube[5][i][2] = cube[1][2][2-i];
cube[1][2][2-i] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[1][2][2-i];
cube[1][2][2-i] = cube[5][i][2];
cube[5][i][2] = cube[3][0][i];
cube[3][0][i] = cube[4][2-i][0];
cube[4][2-i][0] = tmp;
}
}
cube[2] = set(cube[2], d);
}
else if(op == 'F') {
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[4][2][2-i];
cube[4][2][2-i] = cube[2][0][i];
cube[2][0][i] = cube[5][2][2-i];
cube[5][2][2-i] = cube[0][2][2-i];
cube[0][2][2-i] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[0][2][2-i];
cube[0][2][2-i] = cube[5][2][2-i];
cube[5][2][2-i] = cube[2][0][i];
cube[2][0][i] = cube[4][2][2-i];
cube[4][2][2-i] = tmp;
}
}
cube[1] = set(cube[1], d);
}
else if(op == 'B') {
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[4][0][i];
cube[4][0][i] = cube[0][0][i];
cube[0][0][i] = cube[5][0][i];
cube[5][0][i] = cube[2][2][2-i];
cube[2][2][2-i] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[2][2][2-i];
cube[2][2][2-i] = cube[5][0][i];
cube[5][0][i] = cube[0][0][i];
cube[0][0][i] = cube[4][0][i];
cube[4][0][i] = tmp;
}
}
cube[3] = set(cube[3], d);
}
else if(op == 'L') {
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[2][2-i][0];
cube[2][2-i][0] = cube[1][2-i][0];
cube[1][2-i][0] = cube[0][2-i][0];
cube[0][2-i][0] = cube[3][2-i][0];
cube[3][2-i][0] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[3][2-i][0];
cube[3][2-i][0] = cube[0][2-i][0];
cube[0][2-i][0] = cube[1][2-i][0];
cube[1][2-i][0] = cube[2][2-i][0];
cube[2][2-i][0] = tmp;
}
}
cube[4] = set(cube[4], d);
}
else {
if(d == '+') {
for(int i = 0; i < 3; i++) {
char tmp = cube[0][i][2];
cube[0][i][2] = cube[1][i][2];
cube[1][i][2] = cube[2][i][2];
cube[2][i][2] = cube[3][i][2];
cube[3][i][2] = tmp;
}
}
else {
for(int i = 0; i < 3; i++) {
char tmp = cube[3][i][2];
cube[3][i][2] = cube[2][i][2];
cube[2][i][2] = cube[1][i][2];
cube[1][i][2] = cube[0][i][2];
cube[0][i][2] = tmp;
}
}
cube[5] = set(cube[5], d);
}
}
public static void print() {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
System.out.print(cube[0][i][j]);
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(br.readLine());
int n = Integer.parseInt(tk.nextToken());
for(int i = 0; i < n; i++) {
tk = new StringTokenizer(br.readLine());
int m = Integer.parseInt(tk.nextToken());
tk = new StringTokenizer(br.readLine());
init();
for(int j = 0; j < m; j++) {
String s = tk.nextToken();
turn(s);
}
print();
}
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
[백준] 3190번 - 뱀 (0) | 2020.03.18 |
---|---|
[백준] 17822번 - 원판 돌리기 (0) | 2020.03.18 |
[백준] 14500번 - 테트로미노 (0) | 2020.03.16 |
[백준] 16234번 - 인구 이동 (0) | 2020.03.16 |
[백준] 14499번 - 주사위 굴리기 (0) | 2020.03.16 |
댓글