쩡류 2021. 11. 16. 20:42
728x90

- 무난한 구현문제이다. (백준 골드5)

 

- 8개의 톱니 * 4개의 톱니바퀴 * 최대 100의 회전 수를 해서 시간복잡도는 신경쓰지 않아도 된다.

 

- 한 번의 회전이 일어날 때 마다, 각 톱니바퀴들이 어느 방향으로 회전 할 지를 조사하여 일괄적으로 변화시키도록 구현한다.

 

- 처음 톱니의 상태를 입력을 받을 때, string 타입의 vector로 받는다. 그 후, 회전시킬 톱니바퀴와 방향을 입력받는다. 톱니바퀴를 기준으로 왼쪽에(혹은 오른쪽에) 있는 톱니들로 이동하면서 회전 여부 및 어느 방향으로 회전을 할 지를 vector d에 담아서 처리한다.

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
	int n = 4;
	vector<string> a(n); // 8방향의 톱니바퀴를 다 구해주고
	for (int i = 0; i<n; i++) {
		cin >> a[i];
	}
	int k;
	cin >> k;
	while (k--) {
		int no, dir; // 회전시킬 톱니바퀴 및 방향
		cin >> no >> dir;
		no -= 1; // index에 맞추기 위해. 1번째 톱니바퀴의 index는 0이 된다.
		// 각각의 톱니는 동시에 회전해야 하기 때문에
		// 먼저, 각 톱니가 어떤 방향으로 회전해야 하는지 구하자
		vector<int> d(n); // 어떤 방향으로 회전 할 지가 담기는 벡터
		d[no] = dir;
		// 왼쪽 톱니를 연쇄적으로 구하고
		for (int i = no - 1; i >= 0; i--) {
			if (a[i][2] != a[i + 1][6]) {
				d[i] = -d[i + 1];
			}
			else {
				// 한 톱니가 회전하지 않으면
				// 그 톱니의 왼쪽에 있는 톱니도 회전하지 않는다.
				break;
			}
		}
		// 오른쪽 톱니를 연쇄적으로 구하고
		for (int i = no + 1; i<n; i++) {
			if (a[i - 1][2] != a[i][6]) {
				d[i] = -d[i - 1];
			}
			else {
				// 한 톱니가 회전하지 않으면
				// 그 톱니의 오른쪽에 있는 톱니도 회전하지 않는다.
				break;
			}
		}
		for (int i = 0; i<n; i++) {
			if (d[i] == 0) continue;
			if (d[i] == 1) {
				// 시계 방향 회전
				char temp = a[i][7];
				for (int j = 7; j >= 1; j--) {
					a[i][j] = a[i][j - 1];
				}
				a[i][0] = temp;
			}
			else if (d[i] == -1) {
				// 반시계 방향 회전
				char temp = a[i][0];
				for (int j = 0; j<7; j++) {
					a[i][j] = a[i][j + 1];
				}
				a[i][7] = temp;
			}
		}
	}
	int ans = 0;
	for (int i = 0; i<n; i++) {
		if (a[i][0] == '1') {
			ans |= (1 << i);
		}
	}
	cout << ans<< '\n';
	return 0;
}