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;
}

+ Recent posts