❓ 문제 ❓
톱니바퀴
💯 문제 풀이 💯
구현 시뮬레이션 유형의 문제이다.
덱 자료구조를 사용해서 자유롭게 앞 뒤 숫자를 옮길 수 있도록 하여 바퀴를 돌렸다.
visit 배열을 정해서 한번 돌린 바퀴는 다시 돌리지 못하게 설정했다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <math.h>
using namespace std;
deque<int> wheel[4]; // 2 - (6, 2) - (6, 2) - 6
bool visit[4];
void turn(int idx, int dir) {
int left = wheel[idx][6], right = wheel[idx][2];
visit[idx] = true;
if (dir == 1) { // right
int back = wheel[idx][7];
wheel[idx].pop_back();
wheel[idx].push_front(back);
}
else if (dir == -1) { // left
int front = wheel[idx][0];
wheel[idx].pop_front();
wheel[idx].push_back(front);
}
if (idx - 1 >= 0 && wheel[idx-1][2] != left && !visit[idx-1]) { // 왼쪽 바퀴랑 극이 다르면
turn(idx - 1, dir * -1);
}
if (idx + 1 < 4 && wheel[idx+1][6] != right && !visit[idx+1]) { // 오른쪽 바퀴랑 극이 다르면
turn(idx + 1, dir * -1);
}
}
int main() {
string s;
for (int i = 0; i < 4; i++) {
cin >> s;
for (int j = 0; j < s.size(); j++) {
wheel[i].push_back(s[j] - '0');
}
}
int k; cin >> k;
for (int i = 0; i < k; i++) {
int cur, dir;
cin >> cur >> dir;
turn(cur - 1, dir);
for (int j = 0; j < 4; j++)
visit[j] = false;
}
int answer = 0;
for (int i = 0; i < 4; i++) {
if (wheel[i][0] == 1) {
answer += pow(2, i);
}
}
cout << answer;
}