아마도 이 사이트에서 문제를 처음 풀어보는것같다. 연주가 문제를 추천해줘서 한번 풀어봤다.

구현 자체는 크게 어렵지 않았다. 그러나 어떻게 코드를 직관적이고 효율적으로 만들지 고민이 많이 들었지만, 일단 맞는것이 중요하다고 생각해 개판으로 짯다......

회전을 할때 진짜 회전을 하는것이 아니라 head를 지정해주고 head의 값만 움직여주면 간편하다.

그렇게 오른쪽 접하는 값 왼쪽 접하는 값을 비교하고 돌릴지 말지 노가다 해주면 끝,,,

#include <iostream>

using namespace std;

int mag[4][8];
int head[4];

int get_right(int idx){
    int temp=head[idx-1];
    for(int i=0;i<2;i++){
        if(temp==7)temp=0;
        else temp++;
    }
    return mag[idx-1][temp];
}

int get_left(int idx){
    int temp=head[idx-1];
    for(int i=0;i<6;i++){
        if(temp==7)temp=0;
        else temp++;
    }
    return mag[idx-1][temp];
}

void turn(int idx, int dir){
    if(dir==1){
        if(head[idx-1]==0) head[idx-1]=7;
        else head[idx-1]--;
    }
    else{
        if(head[idx-1]==7) head[idx-1]=0;
        else head[idx-1]++;
    }
}

int main(void){
    int T,K;
    int idx, dir;
    int time=0;
    cin>>T;

    while(T--){
        time++;
        cin>>K;

        for(int i=0;i<4;i++){
            head[i]=0;
        }
        for(int i=0;i<4;i++){
            for(int j=0;j<8;j++){
                cin>>mag[i][j];
            }
        }
        for(int i=0;i<K;i++){
            cin>>idx>>dir;
            bool same[3]={false,false,false};

            if(get_right(1)==get_left(2))same[0]=true;
            if(get_right(2)==get_left(3))same[1]=true;
            if(get_right(3)==get_left(4))same[2]=true;

            if(idx==1){
                turn(idx, dir);
                if(same[0]==false){
                    turn(idx+1,dir*-1);
                    if(same[1]==false){
                        turn(idx+2,dir);
                        if(same[2]==false){
                            turn(idx+3,dir*-1);
                        }
                    }
                }
            }
            else if(idx==2){
                turn(idx,dir);
                if(same[0]==false){
                    turn(idx-1,dir*-1);
                }
                if(same[1]==false){
                    turn(idx+1,dir*-1);
                    if(same[2]==false){
                        turn(idx+2,dir);
                    }
                }
            }
            else if(idx==3){
                turn(idx,dir);
                if(same[2]==false){
                    turn(idx+1,dir*-1);
                }
                if(same[1]==false){
                    turn(idx-1,dir*-1);
                    if(same[0]==false){
                        turn(idx-2,dir);
                    }
                }
            }
            else{
                turn(idx,dir);
                if(same[2]==false){
                    turn(idx-1,dir*-1);
                    if(same[1]==false){
                        turn(idx-2,dir);
                        if(same[0]==false){
                            turn(idx-3,dir*-1);
                        }
                    }
                }
            }
        }
        int total=0;
        for(int i=0;i<4;i++){
            if(mag[i][head[i]]==1){
                int score=1;
                for(int j=0;j<i;j++) score*=2;
                total+=score;
            }
        }
        cout<<"#"<<time<<" "<<total<<endl;
    }
}

+ Recent posts