[백준] 14891. 톱니바퀴

고재욱·2021년 10월 4일

Baekjoon

목록 보기
18/35

❓ 문제 ❓
톱니바퀴

💯 문제 풀이 💯
구현 시뮬레이션 유형의 문제이다.
덱 자료구조를 사용해서 자유롭게 앞 뒤 숫자를 옮길 수 있도록 하여 바퀴를 돌렸다.
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;
}

0개의 댓글