Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

선택과 집중

백준 5373번(큐빙) c++ 풀이 본문

알고리즘, 코딩테스트

백준 5373번(큐빙) c++ 풀이

552bin 2025. 4. 6. 05:52

https://www.acmicpc.net/problem/5373

 

보고 로직은 빨리 떠올랐는데 구현할 때 살짝 까다로워서 오래 걸렸다..

전역변수 side에 값 넣을 때 방향이나,, junc 배열 채울 때 B가 뒤집어져있으니까 종이에다가 그려가면서 난리쳤다 ㅠ

확실히 3차원적으로 생각해야하는 문제에 약한 것 같음...

그리고 변수이름 정하기 힘들다..ㅋㅋ 구글에 "접합 영어로" "큐브 돌리다 영어로"

 

...

 

우선은 큐브의 한 면을

0 1 2

3 4 5

6 7 8

이렇게 생각하는데, up right down left 의 4가지 side로 구분했다.

side[]에 저장할 때 아무렇게나 하는 게 아니라 큐브의 회전을 생각해서 할당해줘야한다. (구현이 쉬우려면)

0에서부터 시계방향으로 진행하도록 해줬다.

012(up) 258(right) 876(down) 630(left)

 

junc[]도 순서에 의미를 줬다..

[0]은 해당 면의 up side와 접하는 {face, side}

[1], [2], [3]은 right, down, left

즉 시계방향이다.

 

이렇게만 세팅해주면 나머지는 단순구현..

원형으로 돌려가면서 한 칸씩 shift??느낌으로다가 이동시켜주면 된다.

 

#include <iostream>
#include <map>

using namespace std;

#define U 0
#define D 1
#define F 2
#define B 3
#define L 4
#define R 5

#define U_SIDE 0
#define R_SIDE 1
#define L_SIDE 2
#define D_SIDE 3

typedef struct cube_junc{
    int face;
    int side;
} cube_junc;

int side[4][3] = {
    {0, 1, 2}, // 0: up
    {2, 5, 8}, // 1: right
    {6, 3, 0}, // 2: left
    {8, 7, 6} // 3: down
};

cube_junc junc[6][4] = {
    {{B, U_SIDE}, {R, U_SIDE}, {F, U_SIDE}, {L, U_SIDE}}, // U => B up, R up, F up, L up
    {{F, D_SIDE}, {R, D_SIDE}, {B, D_SIDE}, {L, D_SIDE}}, // D => F down, R down, B down, L down
    {{U, D_SIDE}, {R, L_SIDE}, {D, U_SIDE}, {L, R_SIDE}}, // F => U down, R left, D up, L right
    {{U, U_SIDE}, {L, L_SIDE}, {D, D_SIDE}, {R, R_SIDE}}, // B => U up, L left, D down, R right
    {{U, L_SIDE}, {F, L_SIDE}, {D, L_SIDE}, {B, R_SIDE}}, // L => U left, F left, D left, B right
    {{U, R_SIDE}, {B, L_SIDE}, {D, R_SIDE}, {F, R_SIDE}} // R => U right, B left, D right, F right
};

map<char, int> faceNum;

int n;
string comm[1000];
char cube[6][9];

void copySide(int face, int fromIdx, int toIdx){
    cube_junc from = junc[face][fromIdx];
    cube_junc to = junc[face][toIdx];
    
    for(int i=0; i<3; i++){
        cube[to.face][side[to.side][i]] = cube[from.face][side[from.side][i]];
    }
    return;
}
void spinCw(int face){ // 시계방향(+)
    char tmp[3];
    for(int i=0; i<2; i++){
        tmp[i] = cube[face][side[U_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[U_SIDE][i]] = cube[face][side[L_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[L_SIDE][i]] = cube[face][side[D_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[D_SIDE][i]] = cube[face][side[R_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[R_SIDE][i]] = tmp[i];
    }
    
    cube_junc from, to;
    
    from = junc[face][0];
    for(int i=0; i<3; i++){
        tmp[i] = cube[from.face][side[from.side][i]];
    }
    copySide(face, 3, 0);
    copySide(face, 2, 3);
    copySide(face, 1, 2);
    
    to = junc[face][1];
    for(int i=0; i<3; i++){
        cube[to.face][side[to.side][i]] = tmp[i];
    }
    
    return;
}
void spinCcw(int face){ // 반시계방향(-)
    char tmp[3];
    for(int i=0; i<2; i++){
        tmp[i] = cube[face][side[U_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[U_SIDE][i]] = cube[face][side[R_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[R_SIDE][i]] = cube[face][side[D_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[D_SIDE][i]] = cube[face][side[L_SIDE][i]];
    }
    for(int i=0; i<2; i++){
        cube[face][side[L_SIDE][i]] = tmp[i];
    }
    
    cube_junc from, to;
    
    from = from = junc[face][0];
    for(int i=0; i<3; i++){
        tmp[i] = cube[from.face][side[from.side][i]];
    }
    
    copySide(face, 1, 0);
    copySide(face, 2, 1);
    copySide(face, 3, 2);
    
    to = junc[face][3];
    for(int i=0; i<3; i++){
        cube[to.face][side[to.side][i]] = tmp[i];
    }
    
    return;
}
void solve(){
    for(int i=0; i<n; i++){
        if(comm[i][1] == '+') spinCw(faceNum[comm[i][0]]);
        else spinCcw(faceNum[comm[i][0]]);
    }
    
    return;
}

void initCube(){
    for(int i=0; i<9; i++){
        cube[U][i] = 'w';
        cube[D][i] = 'y';
        cube[F][i] = 'r';
        cube[B][i] = 'o';
        cube[L][i] = 'g';
        cube[R][i] = 'b';
    }
    return;
}
int main(){
    faceNum['U'] = U;
    faceNum['D'] = D;
    faceNum['F'] = F;
    faceNum['B'] = B;
    faceNum['L'] = L;
    faceNum['R'] = R;
    
    int T;
    cin >> T;
    
    for(int test_case=1; test_case<=T; test_case++){
        initCube();
        
        cin >> n;
        for(int i=0; i<n; i++) cin >> comm[i];
        
        solve();
        
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                cout << cube[U][i * 3 + j];
            }
            cout << '\n';
        }
    }
    
    return 0;
}