반응형
5373번 큐빙
1. 이해하기
- 큐브를 돌려가면서 그때의 윗 면의 색상을 구하는 문제이다.
- 큐브를 돌렸을 때 돌린 면을 포함, 다른 면들이 어떻게 변하는지 구현하는 시뮬레이션 문제.
2. 구현하기
-
각 면에 대해 그 면을 시계 방향, 반시계 방향으로 돌렸을 때 어떻게 되는지 구현.
- 그림을 그려서 이해하면 이해하기 쉽다.
void temp_to_cube(char temp[3][3], char cube[3][3]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { cube[i][j] = temp[i][j]; } } } void rotate_clock(char cube[3][3]) { char temp[3][3]; for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { temp[j][3-i-1] = cube[i][j]; } } temp_to_cube(temp,cube); } void rotate_anticlock(char cube[3][3]) { char temp[3][3]; for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { temp[3-j-1][i] = cube[i][j]; } } temp_to_cube(temp,cube); } void up_clock(char u[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) { rotate_clock(u); char t1 = b[2][0], t2 = b[2][1], t3 = b[2][2]; b[2][0] = l[0][2]; b[2][1] = l[0][1]; b[2][2] = l[0][0]; 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] = t3; r[0][1] = t2; r[0][2] = t1; } void up_anticlock(char u[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) { rotate_anticlock(u); char t1 = b[2][0], t2 = b[2][1], t3 = b[2][2]; b[2][0] = r[0][2]; b[2][1] = r[0][1]; b[2][2] = r[0][0]; r[0][0] = f[0][0]; r[0][1] = f[0][1]; r[0][2] = f[0][2]; f[0][0] = l[0][0]; f[0][1] = l[0][1]; f[0][2] = l[0][2]; l[0][0] = t3; l[0][1] = t2; l[0][2] = t1; } void down_clock(char d[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) { rotate_clock(d); char t1 = f[2][0], t2 = f[2][1], t3 = f[2][2]; f[2][0] = l[2][0]; f[2][1] = l[2][1]; f[2][2] = l[2][2]; l[2][0] = b[0][2]; l[2][1] = b[0][1]; l[2][2] = b[0][0]; b[0][2] = r[2][0]; b[0][1] = r[2][1]; b[0][0] = r[2][2]; r[2][0] = t1; r[2][1] = t2; r[2][2] = t3; } void down_anticlock(char d[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) { rotate_anticlock(d); char t1 = f[2][0], t2 = f[2][1], t3 = 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] = t1; l[2][1] = t2; l[2][2] = t3; } void front_clock(char f[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) { rotate_clock(f); char t1 = u[2][0], t2 = u[2][1], t3 = u[2][2]; u[2][0] = l[2][2]; u[2][1] = l[1][2]; u[2][2] = l[0][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[0][0] = t1; r[1][0] = t2; r[2][0] = t3; } void front_anticlock(char f[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) { rotate_anticlock(f); char t1 = u[2][0], t2 = u[2][1], t3 = 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][0] = l[0][2]; d[0][1] = l[1][2]; d[0][2] = l[2][2]; l[2][2] = t1; l[1][2] = t2; l[0][2] = t3; } void back_clock(char b[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) { rotate_clock(b); char t1 = d[2][0], t2 = d[2][1], t3 = d[2][2]; d[2][0] = l[0][0]; d[2][1] = l[1][0]; d[2][2] = l[2][0]; l[0][0] = u[0][2]; l[1][0] = u[0][1]; l[2][0] = u[0][0]; u[0][2] = r[2][2]; u[0][1] = r[1][2]; u[0][0] = r[0][2]; r[2][2] = t1; r[1][2] = t2; r[0][2] = t3; } void back_anticlock(char b[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) { rotate_anticlock(b); char t1 = d[2][0], t2 = d[2][1], t3 = 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] = t1; l[1][0] = t2; l[2][0] = t3; } void left_clock(char l[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) { rotate_clock(l); char t1 = u[0][0], t2 = u[1][0], t3 = u[2][0]; u[0][0] = b[0][0]; u[1][0] = b[1][0]; u[2][0] = b[2][0]; b[2][0] = d[2][0]; b[1][0] = d[1][0]; b[0][0] = d[0][0]; d[2][0] = f[2][0]; d[1][0] = f[1][0]; d[0][0] = f[0][0]; f[0][0] = t1; f[1][0] = t2; f[2][0] = t3; } void left_anticlock(char l[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) { rotate_anticlock(l); char t1 = u[0][0], t2 = u[1][0], t3 = 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] = t1; b[1][0] = t2; b[2][0] = t3; } void right_clock(char r[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) { rotate_clock(r); char t1 = u[2][2], t2 = u[1][2], t3 = u[0][2]; u[2][2] = f[2][2], u[1][2] = f[1][2]; u[0][2] = f[0][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[2][2] = t1; b[1][2] = t2; b[0][2] = t3; } void right_anticlock(char r[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) { rotate_anticlock(r); char t1 = u[2][2], t2 = u[1][2], t3 = u[0][2]; u[2][2] = b[2][2]; u[1][2] = b[1][2]; u[0][2] = b[0][2]; b[2][2] = d[2][2]; b[1][2] = d[1][2]; b[0][2] = d[0][2]; d[2][2] = f[2][2]; d[1][2] = f[1][2]; d[0][2] = f[0][2]; f[2][2] = t1; f[1][2] = t2; f[0][2] = t3; }
-
큐브를 돌린 방법을 받고 그에 맞게 명령을 수행해 준다.
void play(int n) { char u[3][3],d[3][3],f[3][3],b[3][3],l[3][3],r[3][3]; init(u,d,f,b,l,r); for(int i = 0; i < n; i++) { string cmd; cin >> cmd; if(cmd[0] == 'U') { if(cmd[1] == '+') { up_clock(u, b, r, f, l); } else if(cmd[1] == '-') { up_anticlock(u, b, r, f, l); } } else if(cmd[0] == 'D') { if(cmd[1] == '+') { down_clock(d, b, r, f, l); } else if(cmd[1] == '-') { down_anticlock(d, b, r, f, l); } } else if(cmd[0] == 'F') { if(cmd[1] == '+') { front_clock(f, u, r, d, l); } else if(cmd[1] == '-') { front_anticlock(f, u, r, d, l); } } else if(cmd[0] == 'B') { if(cmd[1] == '+') { back_clock(b, u, r, d, l); } else if(cmd[1] == '-') { back_anticlock(b, u, r, d, l); } } else if(cmd[0] == 'L') { if(cmd[1] == '+') { left_clock(l, u, f, d, b); } else if(cmd[1] == '-') { left_anticlock(l, u, f, d, b); } } else if(cmd[0] == 'R') { if(cmd[1] == '+') { right_clock(r, u, f, d, b); } else if(cmd[1] == '-') { right_anticlock(r, u, f, d, b); } } } print_up(u); }
-
명령을 모두 수행한 후 윗 면을 출력
void print_up(char u[3][3]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { cout << u[i][j]; } cout << '\n'; } }
3. 전체 코드
#include <iostream>
using namespace std;
void init(char u[3][3], char d[3][3], char f[3][3], char b[3][3], char l[3][3], char r[3][3]) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
u[i][j] = 'w'; d[i][j] = 'y'; f[i][j] = 'r';
b[i][j] = 'o'; l[i][j] = 'g'; r[i][j] = 'b';
}
}
}
void temp_to_cube(char temp[3][3], char cube[3][3]) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
cube[i][j] = temp[i][j];
}
}
}
void rotate_clock(char cube[3][3]) {
char temp[3][3];
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
temp[j][3-i-1] = cube[i][j];
}
}
temp_to_cube(temp,cube);
}
void rotate_anticlock(char cube[3][3]) {
char temp[3][3];
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
temp[3-j-1][i] = cube[i][j];
}
}
temp_to_cube(temp,cube);
}
void up_clock(char u[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) {
rotate_clock(u);
char t1 = b[2][0], t2 = b[2][1], t3 = b[2][2];
b[2][0] = l[0][2]; b[2][1] = l[0][1]; b[2][2] = l[0][0];
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] = t3; r[0][1] = t2; r[0][2] = t1;
}
void up_anticlock(char u[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) {
rotate_anticlock(u);
char t1 = b[2][0], t2 = b[2][1], t3 = b[2][2];
b[2][0] = r[0][2]; b[2][1] = r[0][1]; b[2][2] = r[0][0];
r[0][0] = f[0][0]; r[0][1] = f[0][1]; r[0][2] = f[0][2];
f[0][0] = l[0][0]; f[0][1] = l[0][1]; f[0][2] = l[0][2];
l[0][0] = t3; l[0][1] = t2; l[0][2] = t1;
}
void down_clock(char d[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) {
rotate_clock(d);
char t1 = f[2][0], t2 = f[2][1], t3 = f[2][2];
f[2][0] = l[2][0]; f[2][1] = l[2][1]; f[2][2] = l[2][2];
l[2][0] = b[0][2]; l[2][1] = b[0][1]; l[2][2] = b[0][0];
b[0][2] = r[2][0]; b[0][1] = r[2][1]; b[0][0] = r[2][2];
r[2][0] = t1; r[2][1] = t2; r[2][2] = t3;
}
void down_anticlock(char d[3][3], char b[3][3], char r[3][3], char f[3][3], char l[3][3]) {
rotate_anticlock(d);
char t1 = f[2][0], t2 = f[2][1], t3 = 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] = t1; l[2][1] = t2; l[2][2] = t3;
}
void front_clock(char f[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) {
rotate_clock(f);
char t1 = u[2][0], t2 = u[2][1], t3 = u[2][2];
u[2][0] = l[2][2]; u[2][1] = l[1][2]; u[2][2] = l[0][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[0][0] = t1; r[1][0] = t2; r[2][0] = t3;
}
void front_anticlock(char f[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) {
rotate_anticlock(f);
char t1 = u[2][0], t2 = u[2][1], t3 = 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][0] = l[0][2]; d[0][1] = l[1][2]; d[0][2] = l[2][2];
l[2][2] = t1; l[1][2] = t2; l[0][2] = t3;
}
void back_clock(char b[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) {
rotate_clock(b);
char t1 = d[2][0], t2 = d[2][1], t3 = d[2][2];
d[2][0] = l[0][0]; d[2][1] = l[1][0]; d[2][2] = l[2][0];
l[0][0] = u[0][2]; l[1][0] = u[0][1]; l[2][0] = u[0][0];
u[0][2] = r[2][2]; u[0][1] = r[1][2]; u[0][0] = r[0][2];
r[2][2] = t1; r[1][2] = t2; r[0][2] = t3;
}
void back_anticlock(char b[3][3], char u[3][3], char r[3][3], char d[3][3], char l[3][3]) {
rotate_anticlock(b);
char t1 = d[2][0], t2 = d[2][1], t3 = 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] = t1; l[1][0] = t2; l[2][0] = t3;
}
void left_clock(char l[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) {
rotate_clock(l);
char t1 = u[0][0], t2 = u[1][0], t3 = u[2][0];
u[0][0] = b[0][0]; u[1][0] = b[1][0]; u[2][0] = b[2][0];
b[2][0] = d[2][0]; b[1][0] = d[1][0]; b[0][0] = d[0][0];
d[2][0] = f[2][0]; d[1][0] = f[1][0]; d[0][0] = f[0][0];
f[0][0] = t1; f[1][0] = t2; f[2][0] = t3;
}
void left_anticlock(char l[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) {
rotate_anticlock(l);
char t1 = u[0][0], t2 = u[1][0], t3 = 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] = t1; b[1][0] = t2; b[2][0] = t3;
}
void right_clock(char r[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) {
rotate_clock(r);
char t1 = u[2][2], t2 = u[1][2], t3 = u[0][2];
u[2][2] = f[2][2], u[1][2] = f[1][2]; u[0][2] = f[0][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[2][2] = t1; b[1][2] = t2; b[0][2] = t3;
}
void right_anticlock(char r[3][3], char u[3][3], char f[3][3], char d[3][3], char b[3][3]) {
rotate_anticlock(r);
char t1 = u[2][2], t2 = u[1][2], t3 = u[0][2];
u[2][2] = b[2][2]; u[1][2] = b[1][2]; u[0][2] = b[0][2];
b[2][2] = d[2][2]; b[1][2] = d[1][2]; b[0][2] = d[0][2];
d[2][2] = f[2][2]; d[1][2] = f[1][2]; d[0][2] = f[0][2];
f[2][2] = t1; f[1][2] = t2; f[0][2] = t3;
}
void print_up(char u[3][3]) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
cout << u[i][j];
}
cout << '\n';
}
}
void play(int n) {
char u[3][3],d[3][3],f[3][3],b[3][3],l[3][3],r[3][3];
init(u,d,f,b,l,r);
for(int i = 0; i < n; i++) {
string cmd;
cin >> cmd;
if(cmd[0] == 'U') {
if(cmd[1] == '+') {
up_clock(u, b, r, f, l);
} else if(cmd[1] == '-') {
up_anticlock(u, b, r, f, l);
}
} else if(cmd[0] == 'D') {
if(cmd[1] == '+') {
down_clock(d, b, r, f, l);
} else if(cmd[1] == '-') {
down_anticlock(d, b, r, f, l);
}
} else if(cmd[0] == 'F') {
if(cmd[1] == '+') {
front_clock(f, u, r, d, l);
} else if(cmd[1] == '-') {
front_anticlock(f, u, r, d, l);
}
} else if(cmd[0] == 'B') {
if(cmd[1] == '+') {
back_clock(b, u, r, d, l);
} else if(cmd[1] == '-') {
back_anticlock(b, u, r, d, l);
}
} else if(cmd[0] == 'L') {
if(cmd[1] == '+') {
left_clock(l, u, f, d, b);
} else if(cmd[1] == '-') {
left_anticlock(l, u, f, d, b);
}
} else if(cmd[0] == 'R') {
if(cmd[1] == '+') {
right_clock(r, u, f, d, b);
} else if(cmd[1] == '-') {
right_anticlock(r, u, f, d, b);
}
}
}
print_up(u);
}
int main() {
int T;
cin >> T;
while(T--) {
int n;
cin >> n;
play(n);
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16235번 나무 재테크 (0) | 2019.10.10 |
---|---|
[백준] 16234번 인구 이동 (0) | 2019.10.09 |
[백준] 15686번 치킨 배달 (0) | 2019.10.08 |
[백준] 15685번 드래곤 커브 (0) | 2019.10.07 |
[백준] 15684번 사다리 조작 (0) | 2019.10.07 |