15662번 톱니바퀴 (2) 71.87%
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <vector>
#include <stdbool.h>
#include <iostream>
using namespace std;
void rot_right(); void rot_left();
int gear[1000][8];
int gear_tmp[8];
int right_gear, left_gear;
int main() {
int gear_num; // 톱니바퀴 갯수
int rot_num; // 회전 횟수
int a;
// vector<vector<int>> v;
scanf("%d", &gear_num); // 기어 갯수 입력
// 톱니바퀴 세팅
for (int i = 0; i < gear_num; i++) {
scanf("%d", &a); // 기어 N극, S극 받음
for (int j = 0; j < 8;j++) {
gear[i][7 - j] = a % 10;
a = a / 10;
}
}
scanf("%d", &rot_num); // 회전 횟수 입력
// 0. 회전 반복
for (int i = 0; i < rot_num; i++) {
int pick; // 선택 기어
int dir; // 시계: 1, 반시계: -1
scanf("%d %d", &pick, &dir);
int pick_gear= pick-1; // 선택 기어의 배열
// 0. 회전 범위 체크
// 0-1. 픽업 기준 왼쪽 체크
left_gear = 0;
for (int k = pick_gear; (left_gear == 0) && (k > 0); k--) {
// k=1 일 때의 예외처리
if (k == 1) {
if (gear[0][2] != gear[k][6]) {
left_gear = 0;
}
else left_gear = 1;
}
// 왼쪽 톱니바퀴의 극성이 같을 경우
else if (gear[k - 1][2] == gear[k][6]) {
left_gear = k;
}
// 다르면 계속 진행
}
// 0-2. 오른쪽 체크
right_gear = gear_num-1;
for (int k = pick_gear; (right_gear == gear_num-1) && (k < gear_num-1); k++) {
// 가장 오른쪽 톱니 비교
if (k == gear_num-2) {
if (gear[k][2] != gear[gear_num-1][6]) {
right_gear = gear_num-1;
}
else right_gear = k;
}
// 극성이 같을 경우
else if (gear[k][2] == gear[k + 1][6]) {
right_gear = k;
}
// 왼쪽 톱니바퀴의 극성이 다를 경우
}
// 1. 회전
// 1-1. 우회전을 대입했을 때
if (dir == 1) {
for (int k = left_gear; k <= right_gear; k++) {
// 한 행 = 기어 복사
for (int j = 0; j < 8; j++) {
gear_tmp[j] = gear[k][j];
}
// 좌, 우 회전
if (abs(k - pick_gear) % 2 == 0) {
rot_right();
}
else {
rot_left();
}
// 다시 대입
for (int j = 0; j < 8; j++) {
gear[k][j] = gear_tmp[j];
}
}
}
// 1-2. 좌회전을 대입했을 때
else if (dir == -1) {
for (int k = left_gear; k <= right_gear; k++) {
// 한 행 = 기어 복사
for (int j = 0; j < 8; j++) {
gear_tmp[j] = gear[k][j];
}
// 좌, 우 회전
if (abs(k - pick_gear) % 2 == 0) {
rot_left();
}
else {
rot_right();
}
// 다시 대입
for (int j = 0; j < 8; j++) {
gear[k][j] = gear_tmp[j];
}
}
} // 좌회전, 우회전 END
} // 회전 반복 END
// 2. S극(1) 카운팅
int cnt = 0;
for (int i = 0; i < gear_num; i++) {
if (gear[i][0]) {
cnt++;
}
}
printf("%d", cnt);
////////////////////////////////
/*printf("\n디버깅");
printf("왼쪽= %d, 오른쪽= %d\n", left_gear, right_gear);
printf("바뀐 톱니\n");
for (int k = 0; k < gear_num; k++) {
for (int i = 0; i < 8; i++) {
if (gear[k][i] == 1) {
printf("1");
}
else {
printf("0");
}
}
printf("\n");
}*/
}
void rot_right() {
bool tmp = gear_tmp[7];
for (int i = 7; i >= 1; i--) {
gear_tmp[i] = gear_tmp[i - 1];
}
gear_tmp[0] = tmp;
}
void rot_left() {
bool tmp = gear_tmp[0];
for (int i = 0; i <= 6; i++) {
gear_tmp[i] = gear_tmp[i + 1];
}
gear_tmp[7] = tmp;
}