반응형

문제 링크

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

풀이 )

  각 k번에 대해서 모든 톱니의 좌우 자석을 보고 옆 톱니의 회전에 따른 다른 톱니 회전 여부를 파악한다. (status)

  지정된 번호의 톱니를 확인한 후 왼쪽으로 방향으로 회전하는 톱니가 있는지 확인하고, 오른쪽 방향도 확인한다.

 

#include <iostream>

using namespace std;

int pow(int x, int n){
    if(n == 0){
        return 1;
    }
    else{
        return x*pow(x, n-1);
    }
}

int right(int gear){
    return gear/pow(10, 5)%10;
}

int left(int gear){
    return gear/10%10;
}

int rotation(int gear, int dir){
    if(dir == 1){
        gear = (gear/10)+(gear%10*pow(10, 7));
    }
    else{
        gear = (gear%pow(10, 7)*10)+gear/pow(10, 7);
    }
    return gear;
}

int main(void){

    int gear[4];
    cin >> gear[0] >> gear[1] >> gear[2] >> gear[3];

    int k;
    cin >> k;
    while(k--){
        int gearNum, dir;
        cin >> gearNum >> dir;
        gearNum--;

        int status[3] = {0, };
        for(int i = 0; i < 3; ++i)
            if(right(gear[i]) != left(gear[i+1]))
                status[i] = 1;

        gear[gearNum] = rotation(gear[gearNum], dir);
        int l = gearNum, r = gearNum;
        dir *= -1;
        int ldir = dir, rdir = dir;
        while(--l >= 0 && status[l] == 1){
            gear[l] = rotation(gear[l], ldir);
            ldir *= -1;
        }
        while(++r < 4 && status[r-1] == 1){
            gear[r] = rotation(gear[r], rdir);
            rdir *= -1;
        }
    }
    int res = 0;
    for(int i = 0; i < 4; ++i)
        res += gear[i]/pow(10, 7)*pow(2, i);

    cout << res << endl;
    return 0;
}
반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1004 : 어린 왕자  (0) 2020.11.29
[C++] 백준 - 1002 : 터렛  (0) 2020.11.29
[C++] 백준 - 14888 : 연산자 끼워넣기  (0) 2020.11.25
[C++] 백준 - 2583 : 영역 구하기  (0) 2020.11.25
[C++] 백준 - 4796 : 캠핑  (0) 2020.11.23

+ Recent posts