관리 메뉴

NineTwo meet you

[백준/자바] 5373 큐빙 본문

프로그래밍 문제/백준

[백준/자바] 5373 큐빙

NineTwo 2021. 9. 18. 22:54
반응형

사진 클릭시 문제로 이동

문제

루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 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

설명

큐브 돌리는 사이트

https://rubiks-cube-solver.com...

어려운 문제는 아닌데 까다로운 문제다.

인덱스 조금만 실수해도 틀림ㅎㅎ

이렇게 까다로운 문제를 한시간 안에 풀어야 되는데 이것 참

이렇게 생겼다고 생각하고 문제 풀기!

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ5373 {
static String U[][] = {{"w","w","w"}, {"w","w","w"}, {"w","w","w"}};
static String F[][] = {{"r","r","r"}, {"r","r","r"}, {"r","r","r"}};
static String D[][] = {{"y","y","y"}, {"y","y","y"}, {"y","y","y"}};
static String B[][] = {{"o","o","o"}, {"o","o","o"}, {"o","o","o"}};
static String L[][] = {{"g","g","g"}, {"g","g","g"}, {"g","g","g"}};
static String R[][] = {{"b","b","b"}, {"b","b","b"}, {"b","b","b"}};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while(t-- > 0) {
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
init();
for(int i = 0; i < n; i++) {
String str[] = st.nextToken().split("");
if(str[0].equals("U")) {
up(str[1]);
}else if(str[0].equals("D")){
down(str[1]);
}else if(str[0].equals("F")) {
front(str[1]);
}else if(str[0].equals("B")) {
back(str[1]);
}else if(str[0].equals("L")) {
left(str[1]);
}else if(str[0].equals("R")) {
right(str[1]);
}
}
print();
}
}
static void print() {
System.out.println(U[0][0]+U[0][1]+U[0][2]);
System.out.println(U[1][0]+U[1][1]+U[1][2]);
System.out.println(U[2][0]+U[2][1]+U[2][2]);
/* All print
System.out.println(" "+U[0][0]+" "+U[0][1]+" "+U[0][2]);
System.out.println(" "+U[1][0]+" "+U[1][1]+" "+U[1][2]);
System.out.println(" "+U[2][0]+" "+U[2][1]+" "+U[2][2]);
System.out.println(L[0][0]+" "+L[0][1]+" "+L[0][2]+" "+F[0][0]+" "+F[0][1]+" "+F[0][2]+" "+R[0][0]+" "+R[0][1]+" "+R[0][2]+" "+B[2][2]+" "+B[2][1]+" "+B[2][0]);
System.out.println(L[1][0]+" "+L[1][1]+" "+L[1][2]+" "+F[1][0]+" "+F[1][1]+" "+F[1][2]+" "+R[1][0]+" "+R[1][1]+" "+R[1][2]+" "+B[1][2]+" "+B[1][1]+" "+B[1][0]);
System.out.println(L[2][0]+" "+L[2][1]+" "+L[2][2]+" "+F[2][0]+" "+F[2][1]+" "+F[2][2]+" "+R[2][0]+" "+R[2][1]+" "+R[2][2]+" "+B[0][2]+" "+B[0][1]+" "+B[0][0]);
System.out.println(" "+D[0][0]+" "+D[0][1]+" "+D[0][2]);
System.out.println(" "+D[1][0]+" "+D[1][1]+" "+D[1][2]);
System.out.println(" "+D[2][0]+" "+D[2][1]+" "+D[2][2]);*/
}
static void init() {
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) U[i][j] = "w";
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) F[i][j] = "r";
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) D[i][j] = "y";
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) B[i][j] = "o";
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) L[i][j] = "g";
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) R[i][j] = "b";
}
static void up(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {B[2][2], B[2][1], B[2][0]};
B[2][2] = L[0][0];
B[2][1] = L[0][1];
B[2][0] = L[0][2];
L[0][0] = F[0][0];
L[0][1] = F[0][1];
L[0][2] = F[0][2];
F[0][0] = R[0][0];
F[0][1] = R[0][1];
F[0][2] = R[0][2];
R[0][0] = first[0];
R[0][1] = first[1];
R[0][2] = first[2];
}else { // 반 시계 방향
String first[] = {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[0][2];
F[0][1] = L[0][1];
F[0][0] = L[0][0];
L[0][2] = first[0];
L[0][1] = first[1];
L[0][0] = first[2];
}
cube("u", d);
}
static void down(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {F[2][2], F[2][1], F[2][0]};
F[2][2] = L[2][2];
F[2][1] = L[2][1];
F[2][0] = L[2][0];
L[2][2] = B[0][0];
L[2][1] = B[0][1];
L[2][0] = B[0][2];
B[0][0] = R[2][2];
B[0][1] = R[2][1];
B[0][2] = R[2][0];
R[2][2] = first[0];
R[2][1] = first[1];
R[2][0] = first[2];
}else { // 반 시계 방향
String first[] = {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[2][0];
B[0][1] = L[2][1];
B[0][0] = L[2][2];
L[2][0] = first[0];
L[2][1] = first[1];
L[2][2] = first[2];
}
cube("d", d);
}
static void front(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {U[2][2], U[2][1], U[2][0]};
U[2][2] = L[0][2];
U[2][1] = L[1][2];
U[2][0] = L[2][2];
L[0][2] = D[0][0];
L[1][2] = D[0][1];
L[2][2] = D[0][2];
D[0][0] = R[2][0];
D[0][1] = R[1][0];
D[0][2] = R[0][0];
R[2][0] = first[0];
R[1][0] = first[1];
R[0][0] = first[2];
}else { // 반 시계 방향
String first[] = {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[2][2];
D[0][1] = L[1][2];
D[0][0] = L[0][2];
L[2][2] = first[0];
L[1][2] = first[1];
L[0][2] = first[2];
}
cube("f", d);
}
static void back(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {D[2][2], D[2][1], D[2][0]};
D[2][2] = L[2][0];
D[2][1] = L[1][0];
D[2][0] = L[0][0];
L[2][0] = U[0][0];
L[1][0] = U[0][1];
L[0][0] = U[0][2];
U[0][0] = R[0][2];
U[0][1] = R[1][2];
U[0][2] = R[2][2];
R[0][2] = first[0];
R[1][2] = first[1];
R[2][2] = first[2];
}else { // 반 시계 방향
String first[] = {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[0][0];
U[0][1] = L[1][0];
U[0][0] = L[2][0];
L[0][0] = first[0];
L[1][0] = first[1];
L[2][0] = first[2];
}
cube("b", d);
}
static void left(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {B[0][0], B[1][0], B[2][0]};
B[0][0] = D[0][0];
B[1][0] = D[1][0];
B[2][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] = first[0];
U[1][0] = first[1];
U[2][0] = first[2];
}else { // 반 시계 방향
String first[] = {U[0][0], U[1][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] = D[0][0];
F[1][0] = D[1][0];
F[2][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] = first[0];
B[1][0] = first[1];
B[2][0] = first[2];
}
cube("l", d);
}
static void right(String d) {
if(d.equals("+")) { // 시계 방향
String first[] = {U[0][2], U[1][2], U[2][2]};
U[0][2] = F[0][2];
U[1][2] = F[1][2];
U[2][2] = F[2][2];
F[0][2] = D[0][2];
F[1][2] = D[1][2];
F[2][2] = D[2][2];
D[0][2] = B[0][2];
D[1][2] = B[1][2];
D[2][2] = B[2][2];
B[0][2] = first[0];
B[1][2] = first[1];
B[2][2] = first[2];
}else { // 반 시계 방향
String first[] = {B[0][2], B[1][2], B[2][2]};
B[0][2] = D[0][2];
B[1][2] = D[1][2];
B[2][2] = D[2][2];
D[0][2] = F[0][2];
D[1][2] = F[1][2];
D[2][2] = F[2][2];
F[0][2] = U[0][2];
F[1][2] = U[1][2];
F[2][2] = U[2][2];
U[0][2] = first[0];
U[1][2] = first[1];
U[2][2] = first[2];
}
cube("r", d);
}
static void cube(String cur, String d) {
String str[][];
if(cur.equals("u")) {
str = U;
}else if(cur.equals("d")){
str = D;
}else if(cur.equals("f")) {
str = F;
}else if(cur.equals("b")) {
str = B;
}else if(cur.equals("l")) {
str = L;
}else {
str = R;
}
if(d.equals("+")) {
int count = 2;
while(count-- > 0) {
// Clock
String i = str[0][2];
str[0][2] = str[0][1];
str[0][1] = str[0][0];
str[0][0] = str[1][0];
str[1][0] = str[2][0];
str[2][0] = str[2][1];
str[2][1] = str[2][2];
str[2][2] = str[1][2];
str[1][2] = i;
}
}else {
int count =2;
while(count-- > 0) {
// banClock
String i = str[0][0];
str[0][0] = str[0][1];
str[0][1] = str[0][2];
str[0][2] = str[1][2];
str[1][2] = str[2][2];
str[2][2] = str[2][1];
str[2][1] = str[2][0];
str[2][0] = str[1][0];
str[1][0] = i;
}
}
if(cur.equals("u")) {
U = str;
}else if(cur.equals("d")){
D = str;
}else if(cur.equals("f")) {
F = str;
}else if(cur.equals("b")) {
B = str;
}else if(cur.equals("l")) {
L = str;
}else {
R = str;
}
}
}
view raw BOJ5373.java hosted with ❤ by GitHub
반응형
Comments