BOJ 15662

톱니바퀴 (2)

문제출처

문제 해석

  • 톱니바퀴의 상태와 회전한 톱니바퀴 정보가 주어질 때, 최종상태의 톱니바퀴의 상태를 구하는 문제입니다.
  • 회전할 톱니바퀴와 맞물려있는 톱니바퀴의 극이 서로 다른 극이면 기준 톱니바퀴가 회전할 방향의 반대로 회전합니다.
  • 만약 맞물려있는 톱니바퀴가 회전하면 그 옆의 톱니바퀴와도 비교하여 회전할 지 정합니다.

설계(5)

  • 단순 구현문제로, 편리성을 위해 톱니바퀴의 상태를 string형으로 저장하였습니다.
  • 기준 톱니바퀴부터 오른쪽으로 체크하고, 왼쪽으로 체크하는 두개의 반복문을 사용합니다.
  • rot배열에 회전여부를 저장해 놓습니다.
  • 만약 회전할 수 없는 상태면 반복문을 빠져나가게 구현합니다.
  • 모든 N개의 톱니바퀴에 대해 rot배열에 저장된 회전 여부에 따라 회전시킵니다.

구현(10)

코드
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define MAXN 1000
int rot[MAXN];

string arr[MAXN];
int N,K;

void rotate(int idx, int dir){
    // 시계방향 회전
    if (dir == 1){
        arr[idx] = arr[idx][7]+arr[idx].substr(0,7);
    }
    // 반시계회전
    else{
        arr[idx] = arr[idx].substr(1)+arr[idx][0];
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> N;
    for (int i =0 ;i<N;i ++){
        cin >> arr[i];
    }
    cin >> K;
    while (K--){
        memset(rot,0,sizeof(rot));
        int idx,dir;
        cin >> idx >> dir;
        idx--;
        int tmp_dir = dir;
        rot[idx] = dir;
        // 오른쪽 검사
        for (int i = idx+1; i< N;i++){
            if ((arr[i-1][2]-'0')+(arr[i][6]-'0')==1){
                rot[i] = -tmp_dir;
                tmp_dir *=-1;
            }
            else break;
        }
        tmp_dir = dir;

        // 왼쪽 검사
        for (int i = idx-1; i >=0; i--){
            if ((arr[i+1][6]-'0')+(arr[i][2]-'0') == 1){
                rot[i] = -tmp_dir;
                tmp_dir *= -1;
            }
            else break;
        }
        for (int i = 0; i < N; i++){
            if (rot[i]==0) continue;
            rotate(i,rot[i]);
        }
    }
    int ans = 0;
    for (int i =0 ;i <N; i++){
        ans += arr[i][0]-'0';
    }
    cout << ans <<"\n";
    return 0;
}
디버깅
제출결과
  • 0 ms

마무리

  • 단순 시뮬레이션 문제였습니다.