https://www.acmicpc.net/problem/14891
#include <vector>
#include <iostream>
#include<string>
using namespace std;
string shift(string s, int d) {
if (d == 1) return s[7] + s.substr(0, 7);
else return s.substr(1, 7) + s[0];
}
int main() {
string gears[4];
int k;
vector<bool> connect(3);
for (int i = 0; i < 4; i++) {
cin >> gears[i];
}
cin >> k;
for (int i = 0; i < k; i++) {
int num, d;
cin >> num >> d;
if (gears[0][2] != gears[1][6]) connect[0] = true;
else connect[0] = false;
if (gears[1][2] != gears[2][6]) connect[1] = true;
else connect[1] = false;
if (gears[2][2] != gears[3][6]) connect[2] = true;
else connect[2] = false;
if (num == 1) {
gears[0] = shift(gears[0], d);
if (connect[0]) {
gears[1] = shift(gears[1], -d);
if (connect[1]) {
gears[2] = shift(gears[2], d);
if (connect[2]) {
gears[3] = shift(gears[3], -d);
}
}
}
}
else if (num == 2) {
gears[1] = shift(gears[1], d);
if (connect[0]) {
gears[0] = shift(gears[0], -d);
}
if (connect[1]) {
gears[2] = shift(gears[2], -d);
if (connect[2]) {
gears[3] = shift(gears[3], d);
}
}
}
else if (num == 3) {
gears[2] = shift(gears[2], d);
if (connect[2]) {
gears[3] = shift(gears[3], -d);
}
if (connect[1]) {
gears[1] = shift(gears[1],-d);
if (connect[0]) {
gears[0] = shift(gears[0], d);
}
}
}
else if (num == 4) {
gears[3] = shift(gears[3], d);
if (connect[2]) {
gears[2] = shift(gears[2], -d);
if (connect[1]) {
gears[1] = shift(gears[1], d);
if (connect[0]) {
gears[0] = shift(gears[0], -d);
}
}
}
}
}
int answer = 0;
int n = 1;
for (int i = 0; i < 4; i ++) {
if (gears[i][0] == '1')
answer += n;
n *= 2;
}
cout << answer;
}
특별한 알고리즘 없이 문제에서 하라는대로 구현하는 문제였습니다 어려운건 없었고 문제에서 톱니바퀴의 정보를 2진수로 주는데 회전할 때마다 값을 시프트 해줘야 합니다 이것만 잘 표현하시면 쉽게 문제 풀 수 있을겁니다