BOJ_15662 : 톱니 바퀴 (2)
문제
총 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;
}
Leave a comment