프로그래밍/알고리즘

BOJ 14891 · 톱니바퀴

반응형


알고리즘 분류 : 시뮬레이션  


톱니바퀴의 회전 동작을 시뮬레이션하는 문제다. 문제는 어렵지 않으나, 회전 방향이 헷갈려서 귀찮은 문제다.


  • 입력으로 주어지는 톱니바퀴를 기준으로 시작한다.
  • 톱니바퀴의 인덱스는 12시 방향부터 시계방향으로 [ 0 1 2 3 4 5 6 7 ] 로 둔다.
  • 1. 기준 톱니바퀴의 왼쪽에 톱니바퀴가 있다면, 기준 톱니바퀴의 왼쪽 톱니(인덱스 6)와 왼쪽 톱니바퀴의 오른쪽 톱니(인덱스 2)를 비교한다.
  • 2. 극이 다르다면, 왼쪽 톱니바퀴의 회전 방향을 기준 톱니바퀴의 반대 회전 방향으로 저장한다.
  • 첫 번째 톱니바퀴까지 1~2 과정을 반복하여, 회전 방향을 저장해둔다.
  • 3. 기준 톱니바퀴의 오른쪽에 톱니바퀴가 있다면, 기준 톱니바퀴의 오른쪽 톱니(인덱스 2)와 오른쪽 톱니바퀴의 왼쪽 톱니(인덱스 6)를 비교한다.
  • 4. 극이 다르다면, 오른쪽 톱니바퀴의 회전 방향을 기준 톱니바퀴의 반대 회전 방향으로 저장한다.
  • 네 번째 톱니바퀴까지 3~4 과정을 반복하여, 회전 방향을 저장해둔다.
  • 마지막으로, 저장해둔 회전 방향에 따라 각 톱니바퀴를 회전시킨다.
  • 위 과정을 K번 반복한다.





C++ 소스코드


int a[4][8];
int k, ans;

void rotate(int n, int d) {
    int t[8];
    if (d == 1) {
        for (int i=0; i<8; i++) {
            t[(i+1)%8] = a[n][i];
        }
    } else {
        for (int i=0; i<8; i++) {
            t[i] = a[n][(i+1)%8];
        }
    }
    for (int i=0; i<8; i++) {
        a[n][i] = t[i];
    }
}
    
void solve() {
    while (k--) {
        int n, d;
        scanf("%d %d", &n, &d); n--;
        int direct[4] = {0};
        direct[n] = d;
        for (int i=n; i<3; i++) {
            if (a[i][2] != a[i+1][6]) direct[i+1] = -direct[i];
        }
        for (int i=n; i>0; i--) {
            if (a[i][6] != a[i-1][2]) direct[i-1] = -direct[i];
        }
        for (int i=0; i<4; i++) {
            if (direct[i]) {
                rotate(i, direct[i]);
            }
        }
    }
}

int main() {
    for (int i=0; i<4; i++) {
        for (int j=0; j<8; j++) {
            scanf("%1d", &a[i][j]);
        }
    }
    scanf("%d", &k);
    solve();
    for (int i=0; i<4; i++) {
        if (a[i][0]) ans += (1<<i);
    }
    printf("%d\n", ans);
    return 0;
}




Python 3 소스코드


def rotate(n, d):
    t = [0]*8
    if d == 1:
        for i in range(8):
            t[(i+1)%8] = a[n][i]
    else:
        for i in range(8):
            t[i] = a[n][(i+1)%8]
    for i in range(8):
        a[n][i] = t[i]

def solve():
    for _ in range(int(input())):
        n, d = map(int, input().split())
        direct = [0]*4
        direct[n-1] = d
        for i in range(n-1, 3):
            if a[i][2] != a[i+1][6]:
                direct[i+1] = -direct[i]
        for i in range(n-1, 0, -1):
            if a[i][6] != a[i-1][2]:
                direct[i-1] = -direct[i]
        for i in range(4):
            if direct[i]:
                rotate(i, direct[i])

a = [list(input().strip()) for _ in range(4)]
solve()
ans = 0
for i in range(4):
    if a[i][0] == '1':
        ans += (1<<i)
print(ans)




참고



반응형