[Beakjoon] 14891 톱니바퀴 (C++)

bin1225·2024년 12월 7일
0

Algorithm

목록 보기
63/68
post-thumbnail

문제 링크

BOJ 14891 : 톱니바퀴

문제

  • 4개의 톱니바퀴가 존재한다.
  • 톱니바퀴는 8개의 극을 가지고 있다.
  • 톱니바퀴가 회전할 때, 인접한 톱니바퀴와 맞물린 극이 다르다면 인접한 톱니바퀴도 회전한다.
  • 회전시킨 후 톱니바퀴의 상태를 이용해 점수를 출력한다.

풀이

삽질을 더럽게 많이 했다.

첫번째로 알게 된 점은 cpp에서 string도 매개변수 전달 시 복사가 된다는 점이다. 따라서 주소값을 매개변수로 전달해야 한다.

이 문제에서 주의할 점은 톱니바퀴의 회전 여부는 인접 톱니바퀴가 회전하기 전 상태에 의존한다.

즉 1번 톱니바퀴를 회전시킬 때, 2번 톱니바퀴가 회전할지에 대한 결정은 1번이 회전하기 이전 상태를 기준으로 결정해야 한다.

이 부분을 잘못 이해해서 1시간은 이왜않 시전했다.

톱니바퀴 1개를 회전시키는 함수 rotate()와 오른쪽 진행과 왼쪽 진행을 실행하는 함수를 run_right(), run_left로 재귀적으로 실행되게 하였다.

코드

#include<bits/stdc++.h>

#define endl "\n"
#define ll long long

using namespace std;

void run_left(int idx, int dir);
void run_right(int idx, int dir);

vector<string> V;

void rotate(string& s, int dir){
    if(dir == 1){
        char c = s.back();
        char bf;
        for(int i=s.size()-1; i>0; i--){
            s[i] = s[i-1];
        }
        s[0] = c;
    }
    else {
        char c = s.front();
        for(int i=0; i<s.size()-1; i++) s[i] = s[i+1];
        s.back() = c;    
    }
}

void run_left(int idx ,int dir){
    if(idx<0) return;
    if(V[idx][2] != V[idx+1][6]) {
        run_left(idx-1, -dir);
        rotate(V[idx], dir);
    }
}

void run_right(int idx, int dir){
    if(idx>3) return;
    if(V[idx][6] != V[idx-1][2]) {
        run_right(idx+1, -dir);
        rotate(V[idx], dir);
    }
}

void Solve() {  
    string s; 
    for(int i=0; i<4; i++){
        cin>>s;
        V.push_back(s);
    }

    int K,idx,dir;
    cin>>K; 
    while(K-->0){
        cin>>idx>>dir;
        idx--;
        run_right(idx+1, -dir);
        run_left(idx-1, -dir);
        rotate(V[idx],dir);
    }

    int ans = 0;
    for(int i=0; i<V.size(); i++){
        if(V[i][0] == '1') ans+=pow(2,i);
        
    }

    cout<<ans;

}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    Solve();

    return 0;
}

구현 문제는 아직 적응을 못 하겠다. 문제를 명확히 이해하고 기능을 구분하는 연습이 부족한 것 같다.

0개의 댓글