곧죽어도 콛잉

[구현 / BOJ 15662 / C++] 톱니바퀴 (2) 본문

Coding Test/C++

[구현 / BOJ 15662 / C++] 톱니바퀴 (2)

코드진행형 2023. 6. 29. 10:49

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

 

15662번: 톱니바퀴 (2)

총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

1) 톱니를 배열로 표현한다
2) 각 톱니의 [2], [6]을 비교한다.
3) rotate를 결정한다.

정돈되지 않은 코드로 .... ㅋㅋㅋㅋ 그냥 머리속에 떠오른대로 막 해봤다.

일단 톱니모양은 어떻게 짜야할까 고민하다가

딱 보니깐 패턴이 있었다. 그냥 배열 그대로 사용하는 것!! 일단은 그림을 그려보자

그림을 보면 간단하다! 톱니의 회전 유무는 바로 배열의 2번째, 6번째 값이 결정한다!!

이게 다르면 회전! 같으면 그대로! 규칙을 쓰면 된다.

 

간단하지 않는가?! 이러고 두 값만 비교하고, rotate 함수를 사용하면 해결!!

 

나머진 재귀적으로 해결하면 된다.

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> v(1000);
int T, K;
int num, dir, tmp;
bool chk_rot[1000]; // 회전한지안한지 확인.


void go(int n, int d){ // n번째 톱니를 d방향으로 회전시킴.
    if(v[n].empty()) return; // 없는 톱니면 종료.
    chk_rot[n]=1; // 회전했는지 체크.
    
    // 톱니배열의 [2](3시방향)는 다음의 [6] 와
    // [6](9시방향)은 이전의 [2] 서로 비교해야함.
    
    // 첫번째 톱니라면
    if(n==0){
        if(v[n][2] != v[n+1][6] && chk_rot[n+1]==0){
            // 다른 극이고, n+1번째 톱니가 회전하지 않았다면
            go(n+1, -d); // 반대방향으로 회전시키기.
        };
    }
    else if(n==T-1){ // 마지막 톱니라면
        if(v[n][6] != v[n-1][2] && chk_rot[n-1]==0){
            // 다른 극이고, n-1번째 톱니가 회전하지 않았다면
            go(n-1, -d); // 반대방향으로 회전시키기.
        };
    }
    else { // 첫번째와 마지막 톱니가 아니라면
        if(v[n][2] != v[n+1][6] && chk_rot[n+1]==0){
            // 다른 극이고, n+1번째 톱니가 회전하지 않았다면
            go(n+1, -d); // 반대방향으로 회전시키기.
        };
        if(v[n][6] != v[n-1][2] && chk_rot[n-1]==0){
            // 다른 극이고, n-1번째 톱니가 회전하지 않았다면
            go(n-1, -d); // 반대방향으로 회전시키기.
        };
    }
    
    if(d==1){ // 시계방향.
        rotate(v[n].rbegin(), v[n].rbegin()+1, v[n].rend());
        // 톱니 회전시키기. 시계방향
    }else if(d==-1){ // 반시계방향
        rotate(v[n].begin(), v[n].begin()+1, v[n].end());
        // 톱니 회전 반시계방향
    }
    
    
    return;
    
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> T;
    
    for(int i = 0 ; i < T ; i++){
        string s;
        cin >> s;
        for(int j = 0 ; j < 8 ; j++){
            
            tmp = s[j]-'0';
            v[i].push_back(tmp);
        }
    }

    
    cin >> K;
    
    for(int i=0 ; i < K ; i++){
        
        cin >> num >> dir;
        
        go(num-1, dir);
        memset(chk_rot, 0, sizeof(chk_rot));
    }
    
    int res = 0;
    for(int i=0; i < T ; i++){
        if(v[i][0]) res++;
    }
    cout << res <<'\n';
}

 

 

Comments