개발세발은 안되요

[C++]BJO 14891 : 톱니바퀴 본문

알고리즘/백준

[C++]BJO 14891 : 톱니바퀴

금호박 2025. 11. 28. 23:41

문제

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

 

 

풀이

문제에 설명된 그대로를 구현한다. 

나는 우선 톱니바퀴의 첫 상태 입력을 arr[][] 이라는 2차원 배열로 저장했다.

이때 톱니바퀴의 정보는 띄어쓰기로 구분되지 않기 때문에 직접 변환해주어야 한다. 

나의 경우 string으로 받아서 int로 변환해주었다.

ex) arr[0][0] : 1번 톱니바튀의 12시 방향 정도

 

 

 

이제 입력받은 돌리기 정보를 이용해 해당 돌리기를 실행했을 때 함께 돌아가는 톱니와 돌아가지 않는 톱니를 먼저 구해놓고 난 후, 일괄적으로 돌려준다.

예를 들어, 3 -1 라는 돌리기 정보가 들어왔을 때
3번을 돌리고 난 후 -> 2번 돌릴지 확인하고 난 후 돌리고 -> 1번 돌릴지 확인하고 돌리기  의 방식이 아니라,

3번을 아직 돌리기 전, 3번을 돌릴 때 함께 회전할 톱니들을 구해놓고 난 후 한꺼번에 돌리기 의 방식을 취해야 한다.

톱니들은 동시에 돌아가기 때문에, 어떤 하나의 톱니를 돌리고 난 후 해당 톱니 주변의 톱니를 돌릴지 말지가 결정되는 것이 아니라 모든 톱니는 함께 돌아가거나 돌아가지 않는다는 점을 기억해야 한다.

 

 

이것들을 이제 직접 구현해주면 된다.

 

 

코드

#include <iostream>
using namespace std;

int arr[4][8];
int k;
int method[100][2];

// 시계 방향 회전 
// n -1 톱늬 회전 
void rotate(int n){
    int cur[8];
    for(int i=0; i<8; i++){
        cur[i] = arr[n][i];
    }
    
    for(int i=0; i<7; i++){
        arr[n][i+1] = cur[i];
    }
    arr[n][0] = cur[7];
}

// 반대 방향 회전 
void rotate_reverse(int n){
    int cur [8];
    
    for(int i=0; i<8; i++){
        cur[i] = arr[n][i];
    }
    
    for(int i=7; i>=1; i--){
        arr[n][i-1] = cur[i];
    }
    
    arr[n][7] = cur[0];
}

void make(int n, int dir){
    n--;
    
    // 선택된 것 기준으로 돌릴 방향, 톱늬 선택 
    int r[4] = {0}; // 0 이면 안 돌림, 1또는 -1은 돌리는 방향 
    
    // n 기준 왼쪽 탐색 
    int cur = dir;
    r[n] = dir;
    for(int i = n-1; i>=0; i--){
        if(arr[i][2] != arr[i+1][6]){
            cur*= -1 ;
            r[i] = cur;
        }
        else{
            cur = 0;
            break; // 더 이상 회전 안 하면 필요 노노 
        }
    }
    
    cur = dir;
    // n 기준 오른쪽 탐색 
    for(int i= n+1; i<8; i++){
        if(arr[i-1][2] != arr[i][6]){
            cur*= -1 ;
            r[i] = cur;
        }
        else{
            cur = 0;
            break; // 더 이상 회전 안 하면 필요 노노 
        }
    }
    
    for(int i=0; i<4; i++){
        if(r[i]== 1) rotate(i);
        else if(r[i] == -1) rotate_reverse(i);
    }
}

int main()
{
    // 입력
    for(int i=0; i<4; i++){
        string s;
        cin >> s;
        for(int j=0; j<8; j++){ 
            arr[i][j] = s[j] - 48;
        }
    }

    cin >> k;
    for(int i=0; i<k; i++){
        cin >> method[i][0] >> method[i][1];
    }
 
    // 돌리기
    for(int i=0; i<k; i++){
        make(method[i][0], method[i][1]);
    }

    // 출력
    int ans = arr[0][0]*1 + arr[1][0]*2 + arr[2][0]*4 + arr[3][0]*8;
    cout << ans << "\n";
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[C++] BJO 1024 : 수열의 합  (0) 2026.01.09
[C++] BJO 17142 : 연구소 3  (0) 2025.12.01
[C++] BJO 14888 : 연산자 끼워넣기  (0) 2025.11.28
[JAVA] BJO 9466 : 텀 프로젝트  (0) 2025.11.19
[C++] 백준 2931 : 회의실 배정  (0) 2025.09.11