[알고리즘] 백준 5373

문제

문제 링크

3x3x3으로 된 큐브를 돌리는 삼성 기출 문제였다.


다음과 같이 12x9로 큐브를 표현하고 각각 돌릴때마다 행렬값을 움직여줬다.

구현 자체가 특별한 규칙보다는 각 상황에 맞게 for문과 if문을 반복 사용해줘서 코드가 굉장히 복잡하고 이쁘지도 않다.

구현 자체 시간도 오래 걸렸는데 마지막에 2군데에서 고비를 겪었다.
1. 내 주변만 돌려주는것이 아니라 내 면도 돌려야한다.
L을 돌리면 B,U,F,D만 돌리는게 아니라 L도 같이 돌려줘야했던걸 마지막에 알았다.
2. 명령문이 'L+'처럼 2개의 문자로 되어있는데 \0처럼 개행문자도 생각해줘야하기 때문에 문자열의 크기를 3으로 했어야했다.
이것때문에 디버깅만 몇시간을...

코드 자체가 굉장히 복잡해질수가 있어서 숫자로 구현해서 편하게 디버깅해보고 나중에 문자로 치환하는게 나을뻔했다.

code

/**
 * 백준 5373
 * 퍼즐
 * U,D,F,B,L,R
 * +:시계, -:반시계
*/
#include <bits/stdc++.h>

using namespace std;

char cube[12][9];
int numCube[12][9];

void initCube(){
    int i,j;
    
    // U,흰
    for(i=3;i<3*2;i++){
        for(j=3;j<3*2;j++) cube[i][j]='w';
    }
    // B,오
    for(i=0;i<3;i++){
        for(j=3;j<3*2;j++) cube[i][j]='o';
    }
    // L,초
    for(i=3;i<3*2;i++){
        for(j=0;j<3;j++) cube[i][j]='g';
    }
    // R,파
    for(i=3;i<3*2;i++){
        for(j=3*2;j<3*3;j++) cube[i][j]='b';
    }
    // F,빨
    for(i=3*2;i<3*3;i++){
        for(j=3;j<3*2;j++) cube[i][j]='r';
    }
    // D,노
    for(i=3*3;i<3*4;i++){
        for(j=3;j<3*2;j++) cube[i][j]='y';
    }
}
void rotateSide(int sy,int sx,int ey,int ex,char way){
    char tmp[8];
    int idx=0;
    if(way=='+'){
        for(int i=ey;i>=sy;i--) tmp[idx++]=cube[i][sx];
        for(int j=sx+1;j<=ex;j++) tmp[idx++]=cube[sy][j];
        for(int i=sy+1;i<=ey;i++) tmp[idx++]=cube[i][ex];
        for(int j=ex-1;j>sx;j--) tmp[idx++]=cube[ey][j];
    }
    else{    
        for(int i=sy;i<=ey;i++) tmp[idx++]=cube[i][ex];
        for(int j=ex-1;j>=sx;j--) tmp[idx++]=cube[ey][j];
        for(int i=ey-1;i>=sy;i--) tmp[idx++]=cube[i][sx];
        for(int j=sx+1;j<ex;j++) tmp[idx++]=cube[sy][j];
    }
    idx=0;
    for(int j=sx;j<=ex;j++) cube[sy][j]=tmp[idx++];
    for(int i=sy+1;i<=ey;i++) cube[i][ex]=tmp[idx++];
    for(int j=ex-1;j>=sx;j--) cube[ey][j]=tmp[idx++];
    for(int i=ey-1;i>sy;i--) cube[i][sx]=tmp[idx++];
}
void move(char* comds){
    char side=comds[0];
    char way=comds[1];
    char tmp[12];
    // L
    if(side=='L'){
        if(way=='+'){
            for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3];
            rotateSide(3,0,5,2,'+');
        }
        else{
            for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3];
            rotateSide(3,0,5,2,'-');
        }
        for(int i=0;i<3*4;i++) cube[i][3]=tmp[i];
    }
    else if(side=='R'){
        if(way=='+'){
            for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3*2-1];
            rotateSide(3,6,5,8,'+');
        }
        else{
            for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3*2-1];
            rotateSide(3,6,5,8,'-');
        }
        for(int i=0;i<3*4;i++) cube[i][3*2-1]=tmp[i];
    }
    else if(side=='B'){
        if(way=='+'){
            // 0~5
            for(int j=3;j<3*3;j++) tmp[j-3]=cube[3][j];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*4-1][j];
            // 9~11
            for(int j=0;j<3;j++) tmp[j+9]=cube[3][j];
            rotateSide(0,3,2,5,'+');
        }
        else{
            // 0~2
            for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*4-1][j];
            // 3~8
            for(int j=0;j<3*2;j++) tmp[j+3]=cube[3][j];
            // 9~11
            for(int j=3*2;j<3*3;j++) tmp[j+3]=cube[3][j];
            rotateSide(0,3,2,5,'-');
        }
        for(int i=0;i<3*3;i++) cube[3][i]=tmp[i];
        for(int i=9;i<12;i++) cube[3*4-1][14-i]=tmp[i];
    }
    else if(side=='F'){
        if(way=='+'){
            // 0~2
            for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*3][j];
            // 3~11
            for(int j=0;j<3*3;j++) tmp[j+3]=cube[3*2-1][j];
            rotateSide(6,3,8,5,'+');
        }
        else{
            // 0~5
            for(int j=3;j<3*3;j++) tmp[j-3]=cube[3*2-1][j];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*3][j];
            // 9~11
            for(int j=0;j<3;j++) tmp[j+9]=cube[3*2-1][j];
            rotateSide(6,3,8,5,'-');
        }
        for(int i=0;i<9;i++) cube[3*2-1][i]=tmp[i];
        for(int i=9;i<12;i++) cube[3*3][14-i]=tmp[i];
    }
    else if(side=='U'){
        if(way=='+'){
            // 0~2
            for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*2][j];
            // 3~5
            for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3-1];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[j+3]=cube[3-1][j];
            // 9~11
            for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][3*2];
            rotateSide(3,3,5,5,'+');
        }
        else{
            // 0~2
            for(int j=3;j<3*2;j++) tmp[j-3]=cube[3-1][j];
            // 3~5
            for(int i=3;i<3*2;i++) tmp[i]=cube[i][3*2];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*2][j];
            // 9~11
            for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3-1];
            rotateSide(3,3,5,5,'-');
        }
        for(int i=0;i<3;i++) cube[5-i][3-1]=tmp[i];
        for(int i=3;i<6;i++) cube[3-1][i]=tmp[i];
        for(int i=6;i<9;i++) cube[i-3][3*2]=tmp[i];
        for(int i=9;i<12;i++) cube[3*2][14-i]=tmp[i];
    }
    else if(side=='D'){
        if(way=='+'){
            // 0~2
            for(int j=3;j<3*2;j++) tmp[5-j]=cube[0][j];
            // 3~5
            for(int i=3;i<3*2;i++) tmp[i]=cube[i][0];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[j+3]=cube[3*3-1][j];;
            // 9~11
            for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3*3-1];
            rotateSide(9,3,11,5,'+');
        }
        else{
            // 0~2
            for(int j=3;j<3*2;j++) tmp[j-3]=cube[3*3-1][j];
            // 3~5
            for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3*3-1];
            // 6~8
            for(int j=3;j<3*2;j++) tmp[11-j]=cube[0][j];
            // 9~11
            for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][0];
            rotateSide(9,3,11,5,'-');
        }
        for(int i=0;i<3;i++) cube[i+3][0]=tmp[i];
        for(int i=3;i<6;i++) cube[3*3-1][i]=tmp[i];
        for(int i=6;i<9;i++) cube[11-i][9-1]=tmp[i];
        for(int i=9;i<12;i++) cube[0][14-i]=tmp[i];
    }
}

void printUp(){
    for(int i=3;i<3*2;i++){
        for(int j=3;j<3*2;j++){
            printf("%c",cube[i][j]);
        }
        printf("\n");
    }
}

int main(void){
    int tc,num;
    cin>>tc;
    while(tc--){
        initCube();
        cin>>num;
        char comds[3];
        while(num--){
            scanf("%s",comds);
            move(comds);
        }
        printUp();
    }
}

좋은 웹페이지 즐겨찾기