[구현]백준14891 톱니바퀴

업데이트:

백준14891

_2021-02-11__11 15 48

_2021-02-11__11 16 03

_2021-02-11__11 16 22

문제에서 설명하는 내용을 그래도 구현하면 되는 문제였다.

각 내용을 따로따로 구현했는데,

오른쪽으로 돌리는 함수 (시계방향으로 돌리기)

void right(int wheelNum){
    int tmp;
    tmp = wheel[wheelNum][7];
    int arr[2];
    arr[0] = wheel[wheelNum][0];
    for(int i=1;i<=7;i++){
        arr[i%2] = wheel[wheelNum][i];
       wheel[wheelNum][i] = arr[(i+1)%2]; 
    }
    wheel[wheelNum][0] = tmp;
}

왼쪽으로 돌리는 함수 (반시계방향으로 돌리기)

void left(int wheelNum){
    int tmp;
    tmp = wheel[wheelNum][0];
    int arr[2];
    arr[1] = wheel[wheelNum][7];
    for(int i = 6;i>=0;i--){
        arr[i%2] = wheel[wheelNum][i];
        wheel[wheelNum][i] = arr[(i+1)%2];
    }
    wheel[wheelNum][7] = tmp;
}

들어오는 바퀴 번호에 따라 번호에 해당하는 바퀴를 돌려주는 spin 함수

void spin(){
    fill(spinned,spinned+5,false);
    cin >> curWheel >> direction;
    if(curWheel==1){
        spin1(direction);
    }
    else if(curWheel==2){
        spin2(direction);
    }
    else if(curWheel==3){
        spin3(direction);
    }
    else if(curWheel==4){
        spin4(direction);
    }

}

각 톱니바퀴는 자신의 이웃한 톱니바퀴를 확인해야 하기 때문에 각 톱니바퀴를 따로 만들어주었다.

1번 톱니바퀴를 돌리는 함수는 2번 톱니바퀴를 확인하고, 돌릴지 여부를 결정해야 한다.

2번 톱니바퀴를 돌리는 함수는 1번과 3번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.

3번 톱니바퀴를 돌리는 함수는 2번과 4번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.

4번 톱니바퀴를 돌리는 함수는 3번 톱니바퀴를 확인하고 돌릴 지 여부를 결정해야 한다.

입력으로 들어온 년만큼 함수를 실행한 뒤 12시 방향을 확인해 점수화한다.

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int wheel[5][8];
bool spinned[5];
int curWheel;
int direction;

void right(int wheelNum){
    int tmp;
    tmp = wheel[wheelNum][7];
    int arr[2];
    arr[0] = wheel[wheelNum][0];
    for(int i=1;i<=7;i++){
        arr[i%2] = wheel[wheelNum][i];
       wheel[wheelNum][i] = arr[(i+1)%2]; 
    }
    wheel[wheelNum][0] = tmp;
}
void left(int wheelNum){
    int tmp;
    tmp = wheel[wheelNum][0];
    int arr[2];
    arr[1] = wheel[wheelNum][7];
    for(int i = 6;i>=0;i--){
        arr[i%2] = wheel[wheelNum][i];
        wheel[wheelNum][i] = arr[(i+1)%2];
    }
    wheel[wheelNum][7] = tmp;
}
void spin1(int mode);
void spin2(int mode);
void spin3(int mode);
void spin4(int mode);

void spin1(int mode){
    spinned[1] = true;
    if(wheel[1][2] != wheel[2][6] && !spinned[2]){
        spin2(mode * -1);
    }
    if(mode==1){
        right(1);
    }
    else{
        left(1);
    }
}
void spin2(int mode){
    spinned[2] = true;
    if(!spinned[1] && wheel[1][2] != wheel[2][6]) spin1(mode*-1);
    if(!spinned[3] && wheel[2][2] != wheel[3][6]) spin3(mode * -1);
    if(mode==1){
        right(2);
    }
    else{
        left(2);
    }
}
void spin3(int mode){
    spinned[3] = true;
    if(!spinned[2] && wheel[2][2] != wheel[3][6]) spin2(mode*-1);
    if(!spinned[4] && wheel[3][2] != wheel[4][6]) spin4(mode * -1);
    if(mode==1){
        right(3);
    }
    else{
        left(3);
    }

}
void spin4(int mode){
    spinned[4] = true;
    if(!spinned[3] && wheel[3][2] != wheel[4][6]) spin3(mode*-1);
    if(mode==1){
        right(4);
    }
    else{
        left(4);
    }
}

void spin(){
    fill(spinned,spinned+5,false);
    cin >> curWheel >> direction;
    if(curWheel==1){
        spin1(direction);
    }
    else if(curWheel==2){
        spin2(direction);
    }
    else if(curWheel==3){
        spin3(direction);
    }
    else if(curWheel==4){
        spin4(direction);
    }

}

int main(){
    for(int i=1;i<=4;i++){
        string s;
        cin >> s;
        for(int j=0;j<s.size();j++){
            wheel[i][j] = s[j]-'0';
        }            
    }
    int k;
    cin >> k;
    int score = 0;
    for(int i=0;i<k;i++){
        spin();
    }
    int tmp = 1;
    for(int j=1;j<=4;j++){
            if(wheel[j][0]!=0) score += tmp;
            tmp *= 2;
        }
    cout << score;
}

카테고리:

업데이트:

댓글남기기