본문 바로가기
백준 문제풀이

[백준][구현] 15662 톱니바퀴 c++ 구현

by 꽁이꽁설꽁돌 2024. 9. 21.
728x90
반응형

목차

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

    문제

     

    문제 접근

    8자리에 0, 1로 이루어져서 비트마스킹으로 할려다가 그게 더 복잡한 것 같아서 그냥 배열로 풀었다.

    맞닿는 인덱스가 2와 6이라는 것을 통해 따로 저장해 두고 그걸 바탕으로 쉬프트 해주면 간단하게 풀 수 있다.

     

     

     

     

    코드 구현

    #include <iostream>
    #include <vector>
    #include<map>
    #include<math.h>
    #include <algorithm>
    
    using namespace std;
    
    //N = 0 S = 1 
    // 1 = 시계 -1=반시계
    //   오 2 -> 6 왼 6->2 
    //다르면 반대 회전 같으면 회전 x
    //1 1 0 1 0 1 1 1-> 1 0 1 0 1 1 1 1
    
    int T, K;
    string str;
    
    vector<int> v[1002];
    
    vector<pair<int, int>> rotation;
    
    void targeting(int idx, int dr) {
        int str = idx;
        int D = dr;
        rotation.push_back({ str, D });
        for (int j = str; j < T - 1; j++) {
            if (v[j][2] == v[j + 1][6])break;
            else {
                if (D == 1)D = -1;
                else
                    D = 1;
                rotation.push_back({ j + 1, D });
            }
        }
        D = dr;
        for (int j = str; j >= 1; j--) {
            if (v[j][6] == v[j - 1][2])break;
            else {
                if (D == 1)D = -1;
                else
                    D = 1;
                rotation.push_back({ j - 1, D });
            }
        }
    
    }
    
    void rotating() {
        for (auto p : rotation) {
            if (p.second == 1) {
                int tmp = v[p.first][7];
                for (int j = 7; j >= 1; j--) {
                    v[p.first][j] = v[p.first][j - 1];
                }
                v[p.first][0] = tmp;
            }
            else {
                int tmp = v[p.first][0];
                for (int j = 0; j <= 6; j++) {
                    v[p.first][j] = v[p.first][j +1];
                }
                v[p.first][7] = tmp;
            }
        }
    }
    
    int counting() {
        int total = 0;
        for (int i = 0; i < T; i++) {
                total += v[i][0];
        }
        return total;
    }
    
    
    int main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int a, b;
        cin >> T;
        for (int i = 0; i < T; i++) {
            cin >> str;
            for (int j = 0; j < 8; j++) {
                v[i].push_back(str[j] - '0');
            }
        }
        cin >> K;
        for (int i = 0; i < K; i++) {
            cin >> a >> b;
            targeting(a-1, b);
            rotating();
            rotation.clear();
        
        }
        cout << counting();
    
        return 0;
    }
    반응형