삽질을 더럽게 많이 했다.
첫번째로 알게 된 점은 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;
}
구현 문제는 아직 적응을 못 하겠다. 문제를 명확히 이해하고 기능을 구분하는 연습이 부족한 것 같다.