반응형
출처: https://www.acmicpc.net/problem/5373
Input
4
1
L-
2
F+ B+
4
U- D- L+ R+
10
L- U- L+ U- L- U- U- L+ U+ U+
Output
rww
rww
rww
bbb
www
ggg
gwg
owr
bwb
gwo
www
rww
정육면체(6) * 시계/반시계 방향(2) = 12가지 회전이 존재합니다.
※ [반시계 방향 이동 1번 = 시계 방향 이동 3번] 특성을 이용할 수도 있습니다.
ex) F+: 앞면을 시계 방향으로 한 번 회전 = F- 앞면을 시계 방향으로 3번 회전
처음 전개도는 다음과 같습니다.
F+(앞 면을 시계방향으로 회전) 실행 후, 전개도는 아래와 같습니다.
차이점은 아래와 같습니다.
회전하는 면의 9개와 인접한 면의 12개까지 총 21개가 변화.
※ 회전할 때 바라보는 면
18 - 19 - 20 - 23 - 26 - 25 - 24 - 21
▶ 24 - 21 - 18 - 19 - 20 - 23 - 26 - 25
※ 인접한 면
6 7 8 / 44 41 38 / 11 10 9 / 45 48 51
▶ 44 41 38 / 11 10 9 / 45 48 51 / 6 7 8
import java.io.*;
import java.util.StringTokenizer;
class Main {
static final int U = 0, D = 1, F = 2, B = 3, L = 4, R = 5;
static char[][][] cube;
static BufferedReader br;
static BufferedWriter bw;
public static void main(String[] args) throws IOException{
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
char[] colors = {'w','y','r','o','g','b'};
int T = Integer.parseInt(br.readLine());
while(T-- > 0) {
// 큐브 초기화
init(colors);
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
while(N-- > 0) {
String rotateInfo = st.nextToken();
// 방향 확인
boolean clk = rotateInfo.charAt(1) == '+';
switch (rotateInfo.charAt(0)) {
case 'U': rotate(U, L, F, R, B, clk); break;
case 'D': rotate(D, B, R, F, L, clk); break;
case 'F': rotate(F, U, L, D, R, clk); break;
case 'B': rotate(B, R, D, L, U, clk); break;
case 'L': rotate(L, F, U, B, D, clk); break;
case 'R': rotate(R, D, B, U, F, clk); break;
}
}
// 정답 출력
printAnswer();
}
bw.flush(); bw.close();
}
private static void rotate(int f, int u, int l, int d, int r, boolean clk) {
char[][] temp = new char[3][3];
char[] temp2 = new char[3];
// 시계방향은 1번, 반시계 방향은 3번
if(clk) {
for (int i=0; i<3; ++i)
for (int j=0; j<3; ++j) {
temp[i][j] = cube[f][2-j][i];
}
for (int i=0; i<3; ++i) temp2[i] = cube[u][i][0];
for (int i=0; i<3; ++i) cube[u][i][0] = cube[l][0][2-i];
for (int i=0; i<3; ++i) cube[l][0][2-i] = cube[d][2][i];
for (int i=0; i<3; ++i) cube[d][2][i] = cube[r][2-i][2];
for (int i=0; i<3; ++i) cube[r][2-i][2] = temp2[i];
}
else {
for (int i=0; i<3; ++i)
for (int j=0; j<3; ++j) {
temp[i][j] = cube[f][j][2-i];
}
for (int i=0; i<3; ++i) temp2[i] = cube[u][i][0];
for (int i=0; i<3; ++i) cube[u][i][0] = cube[r][2-i][2];
for (int i=0; i<3; ++i) cube[r][2-i][2] = cube[d][2][i];
for (int i=0; i<3; ++i) cube[d][2][i] = cube[l][0][2-i];
for (int i=0; i<3; ++i) cube[l][0][2-i] = temp2[i];
}
cube[f] = temp;
}
private static void printAnswer() throws IOException{
for (int i=0; i<3; ++i) {
for (int j=0; j<3; ++j) {
bw.write(cube[0][j][2-i]);
}
bw.write("\n");
}
}
private static void init(char[] colors) {
int n = colors.length;
cube = new char[n][][];
for (int i=0; i<n; ++i) {
cube[i] = new char[3][3];
for (int j=0; j<3; ++j){
for (int k=0; k<3; ++k) {
cube[i][j][k] = colors[i];
}
}
}
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 17825 주사위 윷놀이 (0) | 2021.02.22 |
---|---|
[BOJ] 백준 17822 원판 돌리기 (0) | 2021.02.22 |
[BOJ] 백준 15686 치킨배달 (0) | 2021.02.22 |
[BOJ] 백준 17837 새로운 게임 2 (0) | 2021.02.22 |
[BOJ] 백준 17780 새로운 게임 (0) | 2021.02.22 |
댓글