❓ 문제 - 백준 큐빙 5373번 - JAVA 풀이법
출처
(https://www.acmicpc.net/problem/5373)
📝 문제해결법
1. 이 문제는 구현으로 풀었다. (아주 빡구현 ^^..ㅎ)
- 각 면 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면에 색깔 값을 2차원배열로 관리하며 돌린다.
- 돌리라는 면과 방향(시계 or 반시계)에 맞춰 함수를 돌려준다. -> 영향받는 다른 면들 상태 변경
- 그리고 해당면을 방향(시계 or 반시계)에 맞춰 90도 돌리는 함수도 돌려준다.
- 각 면에 맞는 2차원 배열을 관리 할 때 바라보는 방향에 맞춰 열과 행을 관리할 수 있도록 한다.
- 밑에 각 면에 파란 부분은 해당 면을 돌리면 영향받는 부분을 표시한 것이다.
2. 돌리는 함수
1) 윗면 돌리기
- 시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다.
- 반시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다.
2) 바닥면 돌리기
- 시계 : 뒷면 -> 왼쪽면 -> 앞면 -> 오른쪽면 -> 뒷면 순서로 영향을 준다.
- 반시계 : 뒷면 -> 오른쪽면 -> 앞면 -> 왼쪽면 -> 뒷면 순서로 영향을 준다.
3) 앞면 돌리기
- 시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다.
- 반시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다.
4) 뒷면 돌리기
- 시계 : 윗면 -> 왼쪽면 -> 바닥면 -> 오른쪽면 -> 윗면 순서로 영향을 준다.
- 반시계 : 윗면 -> 오른쪽면 -> 바닥면 -> 왼쪽면 -> 윗면 순서로 영향을 준다.
5) 왼쪽면 돌리기
- 시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다.
- 반시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다.
6) 오른쪽면 돌리기
- 시계 : 윗면 -> 뒷면 -> 바닥면 -> 앞면 -> 윗면 순서로 영향을 준다.
- 반시계 : 윗면 -> 앞면 -> 바닥면 -> 뒷면 -> 윗면 순서로 영향을 준다.
3. 느낀점
- 4시간 이상은 걸린 .. ㅎㅎ
- 제발 ! 자바 값 복사할 때 clone 쓰거나 그대로 값 넣어주자...
- 자바는... 얕은 복사의 경우 조심하자...........
💻 소스코드
// BOJ - 큐빙(5373번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_5373 {
public static char[][] up;
public static char[][] down;
public static char[][] front;
public static char[][] back;
public static char[][] left;
public static char[][] right;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int TC = Integer.parseInt(br.readLine());
for(int test_case=1;test_case<=TC;test_case++) {
int n = Integer.parseInt(br.readLine());
String[] data = br.readLine().split(" ");
up = new char[][]{{'w', 'w', 'w'}, {'w', 'w', 'w'}, {'w', 'w', 'w'}};
down = new char[][]{{'y', 'y', 'y'}, {'y', 'y', 'y'}, {'y', 'y', 'y'}};
front = new char[][]{{'r', 'r', 'r'}, {'r', 'r', 'r'}, {'r', 'r', 'r'}};
back = new char[][]{{'o', 'o', 'o'}, {'o', 'o', 'o'}, {'o', 'o', 'o'}};
left = new char[][]{{'g', 'g', 'g'}, {'g', 'g', 'g'}, {'g', 'g', 'g'}};
right = new char[][]{{'b', 'b', 'b'}, {'b', 'b', 'b'}, {'b', 'b', 'b'}};
for(int i=0;i<n;i++) {
String str = data[i];
char move = str.charAt(0);
char dir = str.charAt(1);
if(move == 'U') {
rotate_U(dir);
} else if(move == 'D') {
rotate_D(dir);
} else if(move == 'F') {
rotate_F(dir);
} else if(move == 'B') {
rotate_B(dir);
} else if(move == 'L') {
rotate_L(dir);
} else if(move == 'R') {
rotate_R(dir);
}
}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
sb.append(up[i][j]);
}
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public static void rotate_U(char dir) {
if(dir == '+') {
up = rotate1(up);
char[] temp = back[0];
back[0] = left[0];
left[0] = front[0];
front[0] = right[0];
right[0] = temp;
// 뒷 - 오 - 앞 - 왼 - 뒷
} else {
up = rotate2(up);
// 뒷 - 왼 - 앞 - 오 - 뒷
char[] temp = back[0].clone();
back[0] = right[0].clone();
right[0] = front[0].clone();
front[0] = left[0].clone();
left[0] = temp;
}
}
public static void rotate_D(char dir) {
if(dir == '+') {
down = rotate1(down);
// 뒷 - 왼 - 앞 - 오 - 뒷
char[] temp = back[2].clone();
back[2] = right[2].clone();
right[2] = front[2].clone();
front[2] = left[2].clone();
left[2] = temp;
} else {
down = rotate2(down);
// 뒷 - 오 - 앞 - 왼 - 뒷
char[] temp = back[2].clone();
back[2] = left[2].clone();
left[2] = front[2].clone();
front[2] = right[2].clone();
right[2] = temp;
}
}
public static void rotate_F(char dir) {
if(dir == '+') {
front = rotate1(front);
// 윗 - 오 - 바 - 왼 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[2][i];
}
for(int i=0;i<3;i++) {
up[2][i] = left[2-i][2];
}
for(int i=0;i<3;i++) {
left[i][2] = down[2][2-i];
}
for(int i=0;i<3;i++) {
down[2][i] = right[i][0];
}
for(int i=0;i<3;i++) {
right[i][0] = temp[i];
}
} else {
front = rotate2(front);
// 윗 - 왼 - 바 - 오 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[2][2-i];
}
for(int i=0;i<3;i++) {
up[2][i] = right[i][0];
}
for(int i=0;i<3;i++) {
right[i][0] = down[2][i];
}
for(int i=0;i<3;i++) {
down[2][i] = left[2-i][2];
}
for(int i=0;i<3;i++) {
left[i][2] = temp[i];
}
}
}
public static void rotate_B(char dir) {
if(dir == '+') {
back = rotate1(back);
// 윗 - 왼 - 바 - 오 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[0][2-i];
}
for(int i=0;i<3;i++) {
up[0][i] = right[i][2];
}
for(int i=0;i<3;i++) {
right[i][2] = down[0][i];
}
for(int i=0;i<3;i++) {
down[0][i] = left[2-i][0];
}
for(int i=0;i<3;i++) {
left[i][0] = temp[i];
}
} else {
back = rotate2(back);
// 윗 - 오 - 바 - 왼 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[0][i];
}
for(int i=0;i<3;i++) {
up[0][i] = left[2-i][0];
}
for(int i=0;i<3;i++) {
left[i][0] = down[0][2-i];
}
for(int i=0;i<3;i++) {
down[0][i] = right[i][2];
}
for(int i=0;i<3;i++) {
right[i][2] = temp[i];
}
}
}
public static void rotate_L(char dir) {
if(dir == '+') {
left = rotate1(left);
// 윗 - 앞 - 바 - 뒷 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[i][0];
}
for(int i=0;i<3;i++) {
up[i][0] = back[2-i][2];
}
for(int i=0;i<3;i++) {
back[i][2] = down[i][2];
}
for(int i=0;i<3;i++) {
down[i][2] = front[2-i][0];
}
for(int i=0;i<3;i++) {
front[i][0] = temp[i];
}
} else {
left = rotate2(left);
// 윗 - 뒷 - 바 - 앞 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[2-i][0];
}
for(int i=0;i<3;i++) {
up[i][0] = front[i][0];
}
for(int i=0;i<3;i++) {
front[i][0] = down[2-i][2];
}
for(int i=0;i<3;i++) {
down[i][2] = back[i][2];
}
for(int i=0;i<3;i++) {
back[i][2] = temp[i];
}
}
}
public static void rotate_R(char dir) {
if(dir == '+') {
right = rotate1(right);
// 윗 - 뒷 - 바 - 앞 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[2-i][2];
}
for(int i=0;i<3;i++) {
up[i][2] = front[i][2];
}
for(int i=0;i<3;i++) {
front[i][2] = down[2-i][0];
}
for(int i=0;i<3;i++) {
down[i][0] = back[i][0];
}
for(int i=0;i<3;i++) {
back[i][0] = temp[i];
}
} else {
right = rotate2(right);
// 윗 - 앞 - 바 - 뒷 - 윗
char[] temp = new char[3];
for(int i=0;i<3;i++) {
temp[i] = up[i][2];
}
for(int i=0;i<3;i++) {
up[i][2] = back[2-i][0];
}
for(int i=0;i<3;i++) {
back[i][0] = down[i][0];
}
for(int i=0;i<3;i++) {
down[i][0] = front[2-i][2];
}
for(int i=0;i<3;i++) {
front[i][2] = temp[i];
}
}
}
// 시계방향으로 90도 회전
public static char[][] rotate1(char[][] arr) {
char[][] rotate = new char[3][3];
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
rotate[i][j] = arr[3-1-j][i];
}
}
return rotate;
}
// 반시계 방향으로 90도 회전
public static char[][] rotate2(char[][] arr) {
char[][] rotate = new char[3][3];
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
rotate[i][j] = arr[j][3-1-i];
}
}
return rotate;
}
}
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
BOJ - 인구 이동 16234번 (JAVA) (0) | 2022.04.29 |
---|---|
BOJ - 나무 재테크 16235번 (JAVA) (0) | 2022.04.22 |
BOJ - 드래곤 커브 15685번 (JAVA) (0) | 2022.04.21 |
BOJ - 사다리 조작 15684번 (JAVA) (0) | 2022.04.21 |
BOJ - 감시 15683번 (Java) (0) | 2022.04.21 |