본문 바로가기

알고리즘/백준

[백준] 5373번 큐빙

반응형

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