일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 나누어 떨어지는 숫자 배열 python
- 최단 경로 알고리즘
- codeup 1020 java
- 빅데이터분석기사
- 가운데 글자 가져오기 자바
- codeup 1020 자바
- 프로그래머스 나누어 떨어지는 숫자 배열 파이썬
- docker 삭제
- m1 docker
- 프로그래머스 가운데 글자 가져오기 자바
- 나누어 떨어지는 숫자 배열 java
- 코드업 1020 java
- m1 docker install
- 빅분기실기
- 트리의 지름 자바
- 가운데 글자 가져오기 java
- docker 완전 삭제
- 코드업 1020 자바
- 프로그래머스 나누어 떨어지는 숫자 배열 자바
- 가운데 글자 가져오기 python
- docker remove
- 프로그래머스 가운데 글자 가져오기 python
- 트리의 지름 java
- 프로그래머스 가운데 글자 가져오기 파이썬
- 핸즈온 머신러닝
- 청년 Ai Big Data 아카데미
- 최소 스패닝 트리
- 청년 AI Big Data 아카데미 13기
- 가운데 글자 가져오기 파이썬
- 최소 스패닝 트리 자바
- Today
- Total
NineTwo meet you
[백준/자바] 5373 큐빙 본문

문제
루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 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; | |
} | |
} | |
} |
'프로그래밍 문제 > 백준' 카테고리의 다른 글
[백준/자바] 17837 새로운 게임 2 (0) | 2021.09.21 |
---|---|
[백준/자바] 14890 경사로 (0) | 2021.09.19 |
[백준/자바] 17140 이차원 배열과 연산 (0) | 2021.09.14 |
[백준/자바] 17822 원판 돌리기 (0) | 2021.09.14 |
[백준/자바] 17144 미세먼지 안녕! (0) | 2021.09.10 |