https://www.acmicpc.net/problem/14891


백준저지 14891번 문제 톱니바퀴 문제 풀이이다.


시뮬레이션 문제이다. 톱니바퀴가 도는 모습을 하나하나 따라가면 된다.


회전하는 경우를 어떻게 구현할 것인가가 관건인데, 12시 방향에 있는 좌표를 저장하는 방식으로 하였다.


Cyclic하게 회전하므로 방향 개수로 Modular 연산을 통해서 cyclic한 형태를 구현할 수 있다.




 

#include <bits/stdc++.h>
using namespace std;

int gear[4][8];
int pos[4]; //12시 방향을 의미함. ++하면 반시계, --하면 시계방향 회전
int rot_delta[4];
int get_polar(int num, int clock) {
    int base = pos[num] + clock;
    if (base >= 8) {
        base = base % 8;
    }
    while (base < 0) {
        base += 8;
    }
    return gear[num][base];
}
int main() {
    for (int i=0; i < 4; i++) {
        for (int j=0; j < 8; j++) {
            scanf("%1d", &gear[i][j]);
        }
    }
    
    int rot;
    cin >> rot;
    for (int i=0; i < rot; i++) {
        int num, dir;
        cin >> num >> dir;
        num--;
        rot_delta[num] = dir; //현재꺼 회전량 저장
        
        int prev = num;
        int cur = prev + 1;
        int prev_dir = dir;
        while (cur < 4) {
            if (get_polar(prev, 2) == get_polar(cur, 6)) break;
            rot_delta[cur] = -prev_dir;
            prev_dir = -prev_dir;
            prev = cur;
            cur++;
        }
        prev = num;
        cur = prev - 1;
        prev_dir = dir;
        while (cur >= 0) {
            if (get_polar(prev, 6) == get_polar(cur, 2)) break;
            rot_delta[cur]  = -prev_dir;
            prev_dir = -prev_dir;
            prev = cur;
            cur--;
        }
        
        for (int j=0; j < 4; j++){
            pos[j] -= rot_delta[j];
            rot_delta[j] = 0;
        }
            
    }
    int ans = 0;
    ans += (get_polar(0, 0) == 0 ? 0 : 1);
    ans += (get_polar(1, 0) == 0 ? 0 : 2);
    ans += (get_polar(2, 0) == 0 ? 0 : 4);
    ans += (get_polar(3, 0) == 0 ? 0 : 8);
  
    
    cout << ans << endl;
	return 0;
}




+ Recent posts