BOJ_15662 : 톱니 바퀴 (2)

1 minute read

문제

총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, …, 가장 오른쪽 톱니바퀴는 T번이다. 아래 그림은 T가 4인 경우이다. (이하생략)

입력

첫째 줄에 톱니바퀴의 개수 T (1 ≤ T ≤ 1,000)가 주어진다.

둘째 줄부터 T개의 줄에 톱니바퀴의 상태가 가장 왼쪽 톱니바퀴부터 순서대로 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다.

다음 줄에는 회전 횟수 K(1 ≤ K ≤ 1,000)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다. 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.

출력

총 K번 회전시킨 이후에 12시방향이 S극인 톱니바퀴의 개수를 출력한다.

C++ 코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int dx[] = { 0,0,-1,1 };
int dy[] = { 1,-1,0,0 };

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n;
	cin >> n;
	vector< string > s(n);
	for (int i = 0; i < n; i++)
		cin >> s[i];

	int t;
	cin >> t;
	while (t--) {
		int k, dir;
		cin >> k >> dir;
		k--;

		vector<int> d(n, 0);

		d[k] = dir;

		int nk = k;
		// 현재 톱니바퀴
		while (nk < n - 1) {

			// 현재 바퀴와 앞바퀴를 비교
			if (s[nk][2] != s[nk + 1][6]) {
				d[nk + 1] = -d[nk];
				nk++;
				// 같으면 다음 바퀴에서 반복
			}
			else {
				break;
			}

		}
		nk = k; 
		while (nk > 0) {
			//현재 바퀴와 이전 바퀴와 비교
			if (s[nk][6] != s[nk - 1][2]) {
				d[nk - 1] = -d[nk];
				nk--;
			}
			else {
				break;
			}

		}

		for (int i = 0; i < n; i++) {
			if (d[i] == 1) { 
				// 시계방향
				char temp = s[i][7];
				for (int j = 7; j > 0; j--) {
					s[i][j] = s[i][j - 1];
				}
				s[i][0] = temp;
			}
			else if (d[i] == -1) {
				// 반시계 방향
				char temp = s[i][0];
				for (int j = 0; j < 7; j++) {
					s[i][j] = s[i][j + 1];
				}
				s[i][7] = temp;
			}
			else
				continue;

		}

	}

	int ans = 0;
	for (int i = 0; i < n; i++) {
		if (s[i][0] == '1') {
			ans++;
		}
	}

	cout << ans << '\n';

	return 0;
}

Updated:

Leave a comment