반갑습니다!

[백준] 14891 톱니바퀴 본문

알고리즘 문제 풀이

[백준] 14891 톱니바퀴

김덜덜이 2020. 5. 8. 18:50
14891번: 톱니바퀴
 
www.acmicpc.net

풀이

시뮬레이션 문제이다. 문제에 나온대로 구현하면 어렵지않게 해결할 수 있다. 구현을 쉽게 하기 위해서 반시계방향은 -1이 아닌 0으로 바꿔주었고, 톱니바퀴의 번호를 1씩 감소시켜 구현하였다.

코드

#include <iostream>
using namespace std;

int k;
int w[4][8];

int get_score() {
    int ret = 0;
    for (int i = 0; i < 4; i++)
        if (w[i][0]) ret += (1 << i);
    return ret;
}

// dir이 1이면 시계방향, 0이면 반시계방향 회전
void spin(int idx, int dir) {
    if (dir == 1) {
        int tmp = w[idx][7];
        for (int i = 7; i >= 1; i--)
            w[idx][i] = w[idx][i - 1];
        w[idx][0] = tmp;
    }
    else {
        int tmp = w[idx][0];
        for (int i = 0; i < 7; i++)
            w[idx][i] = w[idx][i + 1];
        w[idx][7] = tmp;
    }
}

// dir이 1이면 시계방향, 0이면 반시계방향
void spin_gears(int idx, int dir) {
    // 1번째 톱니바퀴
    if (idx == 0) {
        // 1, 2가 다른 경우
        if (w[0][2] != w[1][6]) {
            // 2, 3이 다른 경우
            if (w[1][2] != w[2][6]) {
                // 3, 4가 다른 경우
                if (w[2][2] != w[3][6])
                    spin(3, !dir);
                spin(2, dir);
            }
            spin(1, !dir);
        }
        spin(0, dir);
    }
    // 2번째 톱니바퀴
    if (idx == 1) {
        if (w[1][6] != w[0][2]) spin(0, !dir);
        if (w[1][2] != w[2][6]) {
            if (w[2][2] != w[3][6])
                spin(3, dir);
            spin(2, !dir);
        }
        spin(1, dir);
    }
    // 3번째 톱니바퀴
    if (idx == 2) {
        if (w[2][2] != w[3][6]) spin(3, !dir);
        if (w[2][6] != w[1][2]) {
            if (w[1][6] != w[0][2])
                spin(0, dir);
            spin(1, !dir);
        }
        spin(2, dir);
    }
    // 4번째 톱니바퀴
    if (idx == 3) {
        if (w[3][6] != w[2][2]) {
            if (w[2][6] != w[1][2]) {
                if (w[1][6] != w[0][2])
                    spin(0, !dir);
                spin(1, dir);
            }
            spin(2, !dir);
        }
        spin(3, dir);
    }
}

int main() {
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 8; j++)
            scanf("%1d", &w[i][j]);
    scanf("%d", &k);
    while (k--) {
        int t1, t2;
        scanf("%d %d", &t1, &t2);
        spin_gears(t1 - 1, t2 == -1 ? 0 : t2);
    }
    cout << get_score() << '\n';     
    return 0;
}