728x90
300x250
하 너무 어렵다. 3일간 하루 2-3시간씩 투자하면서 틈틈히 풀었던 문제..
경우의 수가 많은데다가 노가다 성이 짙은 문제였다..
머리로 큐브가 돌아가는걸 시뮬레이션 하기가 어려워서 그림으로 그려서 확인했다.
테케는 다맞는데 틀렸습니다가 자꾸 나와서 반례를 찾는다고 혼자서 삽질했다.
그러다 우연히 찾은 사이트 : https://rubiks-cube-solver.com/fr/
큐브를 돌려볼 수 있는 사이트이다. 인터넷은 대단하다.
찾은 반례
16
B+ D- U+ F- R- B+ B- B- R- R- U+ L- L+ L- R+ B-
문제풀이 힌트
1. 시계방향으로 3번돌리면 반시계방향 돌린 것과 같음
2. 모든 회전이 일어날때마다 나 자신(해당 방향의 면)도 90도 회전이 일어나야한다.
import java.util.*;
public class Main {
public static int T,N;
public static char[][] left,up,down,right,front,back;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
T = sc.nextInt();
left = new char[3][3];
up = new char[3][3];
down = new char[3][3];
right = new char[3][3];
front = new char[3][3];
back = new char[3][3];
for (int tc = 0; tc < T; tc++) {
initCube();
N = sc.nextInt();
for (int rotate = 0; rotate < N; rotate++) {
String str = sc.next();
if(str.charAt(1)=='+') {
cube(str.charAt(0));
}else {
//반시계방향은 시계방향을 3번돌린 것과 같다.
for (int i = 0; i < 3; i++) {
cube(str.charAt(0));
}
}
}
printUp();
//printUp();
}
}
public static void initCube() {
for (char[] carr : left)
Arrays.fill(carr,'g');
for (char[] carr : up)
Arrays.fill(carr,'w');
for (char[] carr : down)
Arrays.fill(carr,'y');
for (char[] carr : front)
Arrays.fill(carr,'r');
for (char[] carr : back)
Arrays.fill(carr,'o');
for (char[] carr : right)
Arrays.fill(carr,'b');
}
public static void cube(char loc) {
if(loc=='L') {
//내 자신 90도 회전
left = selfRotate(left);
//다른 면 회전
for (int i = 0; i < 3; i++) {
char temp = back[2-i][0];
back[2-i][0] = down[2-i][0];
down[2-i][0] = front[i][0];
front[i][0] = up[i][0];
up[i][0]=temp;
}
}
else if(loc=='F') {
//내 자신 90도 회전
front = selfRotate(front);
for (int i = 0; i < 3; i++) {
char temp = left[2-i][2];
left[2-i][2] = down[2][2-i];
down[2][2-i] = right[i][2];
right[i][2] = up[2][i];
up[2][i] = temp;
}
}
else if(loc=='U') {
//내 자신 90도 회전
up = selfRotate(up);
//다른 면 회전
for (int i = 0; i < 3; i++) {
char temp = front[0][2-i];
front[0][2-i] = right[0][i];
right[0][i] = back[0][i];
back[0][i] = left[0][2-i];
left[0][2-i] = temp;
}
}
else if(loc=='R') {
//내 자신 90도 회전
right = selfRotate(right);
right = selfRotate(right);
right = selfRotate(right);
//다른 면 회전
for (int i = 0; i < 3; i++) {
char temp = down[i][2];
down[i][2] = back[i][2];
back[i][2] = up[2-i][2];
up[2-i][2] = front[2-i][2];
front[2-i][2]=temp;
}
}
else if(loc=='D') {
//내 자신 90도 회전
down = selfRotate(down);
down = selfRotate(down);
down = selfRotate(down);
//다른 면 회전
for (int i = 0; i < 3; i++) {
char temp = back[2][2-i];
back[2][2-i] = right[2][2-i];
right[2][2-i] = front[2][i];
front[2][i] = left[2][i];
left[2][i] = temp;
}
}
else if(loc=='B') {
//내 자신 90도 회전
back = selfRotate(back);
back = selfRotate(back);
back = selfRotate(back);
//다른 면 회전
for (int i = 0; i < 3; i++) {
char temp = right[2-i][0];
right[2-i][0] = down[0][i];
down[0][i] = left[i][0];
left[i][0] = up[0][2-i];
up[0][2-i] = temp;
}
}
}
public static char[][] selfRotate(char[][] arr) {
//System.out.println("---COPY---");
char[][] copy = new char[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
copy[i][j] = arr[2-j][i];
//System.out.print(copy[i][j]);
}
//System.out.println();
}
return copy;
}
public static void printUp() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(up[i][j]);
}
System.out.println();
}
}
}
back, down, right 는 selfRotate를 3번씩 돌렸다.. 왜냐면..
큐브에 이렇게 번호를 부여했기 때문에 실제 down방향에서 돌리는 것은 down방향을 바라보고 돌리는 것이기때문에 내가 짜놓은 함수랑은 반대로 돌아가는거 => 좌우반전이 된상태로 돌아가는 것과 같았기 때문이다.. (이거때문에 엄청 오래걸림 흑흑)
아구 어렵따
728x90
'알고리즘 > DP' 카테고리의 다른 글
백준 12852번: 1로 만들기 2 [DP] - Java (0) | 2020.09.12 |
---|---|
백준 1463번: 1로 만들기 [DP] - Java (0) | 2020.09.12 |
백준 14890번 : 경사로 (0) | 2020.07.19 |
백준 14891번: 톱니바퀴 (0) | 2020.03.10 |
백준 1932번 : 정수 삼각형 (0) | 2020.03.01 |