본문 바로가기
SWE/코테

[성실코딩 2일차] 백준 #14891 톱니바퀴 *

by S나라라2 2018. 10. 16.
반응형

성실코딩이 아니라 나는 게으름 코딩이야아ㅠㅠ


오늘 이거 풀고 자려고 지금 새벽 4시까지 못잤다ㅠㅠㅠㅠㅠㅠㅠㅠㅠ


그러나 결국 어느 부분이 틀렷는지 디버깅 못하고 나는 자러간다,,,,,


역시 코딩은 맑은 정신에 해야지 짧고 굵게 끝낼 수 있다!!!!!!!!!!! 일단 코드 저장해두고 자야지


#include<iostream>

using namespace std;

#define wheel 4  // 바퀴 갯수
#define st 8   // 각 바퀴마다 톱니 갯수

int queue[wheel][st] = {0,};

int start_p[4] = {0,0,0,0};
int end_p[4] = {7,7,7,7};

// _wheel_num : 해당 바퀴 번호
// _clockwise = 1 : 시계방향
//            = -1 : 반시계방향
// 이미 방문해서 회전시킨 바퀴는 방문하지 않기위해
// _from = -1 : 왼쪽에서 왔음. 왼쪽은 방문하지 않아도 됌
//       =  1 : 오른쪽에서 왔음 
void rotateWheel(int _wheel_num, int _clockwise, int _from) {

	int s_p = start_p[_wheel_num];
	int e_p = end_p[_wheel_num];

	// 인접한 바퀴들을 회전시킬껀지 확인
	bool call_left_func = false;
	bool call_right_func = false;


	// 좌측의 바퀴를 확인해주는 경우
	if (_wheel_num - 1 >= 0 && _from!=1) {
		int left_wheel = _wheel_num - 1;
		// 현재 휠의 index6 - 왼쪽 wheel의 index 2 비교
		if (queue[_wheel_num][e_p - 1] != queue[left_wheel][start_p[left_wheel]+2]) { 
			// 다를 경우 회전
			call_left_func = true;
		}
	}

	//우측의 바퀴를 확인해주는 경우
	if (_wheel_num + 1 < wheel && _from != -1) {
		int right_wheel = _wheel_num + 1;
		// 현재 휠의 index2 - 오른쪽 휠의 index 6 비교
		if (queue[_wheel_num][s_p+2] != queue[right_wheel][end_p[right_wheel]-1]) {
			// 다를 경우 회전
			call_right_func = true;
		}
	}
	
	// 현재 해당 바퀴 회전
	if (_clockwise == 1) { // 시계방향
		s_p--; if (s_p == -1) s_p = 7;
		e_p--; if (e_p == -1) e_p = 7;

		start_p[_wheel_num] = s_p;
		end_p[_wheel_num] = e_p;
	}
	else { // 반시계방향
		s_p = (s_p + 1) % st;
		e_p = (e_p + 1) % st;

		start_p[_wheel_num] = s_p;
		end_p[_wheel_num] = e_p;
	}

	// 좌측바퀴, 우측바퀴 회전
	if (call_left_func==true) {
		rotateWheel(_wheel_num-1, -_clockwise,1);
	}
	if (call_right_func==true) {
		rotateWheel(_wheel_num+1, -_clockwise,-1);
	}
}

int main(void) {

	int tc; // 회전 횟수

	// 톱니바퀴 입력받기
	for (int i = 0; i < wheel; i++) {
		int temp;
		cin >> temp;
		int mul = 10;
		for (int j = (st-1); j >= 0; j--) {
			queue[i][j] = temp % mul; // 나머지
			temp = temp /mul; //몫 
		}
	}
	
	cin >> tc;

	// 입력값에 맞게 해당 바퀴와 인접한 바퀴 회전시키기.
	for (int i = 0; i < tc; i++) {
		int wheel_num;
		int clockwise;
		cin >> wheel_num >> clockwise;

		rotateWheel(wheel_num-1,clockwise,0);
	}

	// 네 톱니바퀴의 점수의 합
	int res = 0;
	int point = 1;
	for (int i = 0; i < wheel; i++) {
		if (queue[i][start_p[i]]) { //s극이면
			res += point;
		}
		point = point * 2;
	}
	
	return 0;
}




야홋 코드 수정했다~~~~~


일단 나가야 되니까 밤에 코드 리뷰랑 문제 리뷰를 다시 적어야겠다!

#include<iostream>
#include<deque>

using namespace std;

deque<int> dq1;
deque<int> dq2;
deque<int> dq3;
deque<int> dq4;

// 방문했던 바퀴는 다시 방문하지 않기 위해
// _from = 1  : 왼쪽에서 왔음.
//       = -1 : 오른쪽에서 왔음.
void rotateWheel(int _wheel_num, int _clockwise, int _from) {
	if (_wheel_num==1) {
		// 오른쪽 바퀴 확인하기.
		// 현재 휠의 index2 - 오른쪽 휠의 index 6 비교
		if (dq1[2]!=dq2[6] && _from!=-1) { 
			rotateWheel(2, -_clockwise, 1);
		}
		// 현재 휠 회전시켜주기.
		if (_clockwise==-1) { //반시계방향 회전
			int temp = dq1.front();
			dq1.pop_front();
			dq1.push_back(temp);
		}
		else {                 // 시계방향 회전
			int temp = dq1.back();
			dq1.pop_back();
			dq1.push_front(temp);
		}
		
	}
	else if (_wheel_num == 2) {
		// 왼쪽 바퀴 확인
		if (dq2[6] != dq1[2] && _from != 1) {
			rotateWheel(1, -_clockwise, -1);
		}
		// 오른쪽 바퀴 확인
		if (dq2[2] != dq3[6] && _from != -1) {
			rotateWheel(3, -_clockwise, 1);
		}
		// 현재 휠 회전시켜주기.
		if (_clockwise == -1) { //반시계방향 회전
			int temp = dq2.front();
			dq2.pop_front();
			dq2.push_back(temp);
		}
		else {                 // 시계방향 회전
			int temp = dq2.back();
			dq2.pop_back();
			dq2.push_front(temp);
		}
	}
	else if (_wheel_num == 3) {
		// 왼쪽 바퀴 확인
		if (dq3[6] != dq2[2] && _from != 1) {
			rotateWheel(2, -_clockwise, -1);
		}
		// 오른쪽 바퀴 확인
		if (dq3[2] != dq4[6] && _from != -1) {
			rotateWheel(4, -_clockwise, 1);
		}
		// 현재 휠 회전시켜주기.
		if (_clockwise == -1) { //반시계방향 회전
			int temp = dq3.front();
			dq3.pop_front();
			dq3.push_back(temp);
		}
		else {                 // 시계방향 회전
			int temp = dq3.back();
			dq3.pop_back();
			dq3.push_front(temp);
		}
	}
	else {
		// 왼쪽 바퀴 확인
		if (dq4[6] != dq3[2] && _from != 1) {
			rotateWheel(3, -_clockwise, -1);
		}
		// 현재 휠 회전시켜주기.
		if (_clockwise == -1) { //반시계방향 회전
			int temp = dq4.front();
			dq4.pop_front();
			dq4.push_back(temp);
		}
		else {                 // 시계방향 회전
			int temp = dq4.back();
			dq4.pop_back();
			dq4.push_front(temp);
		}
	}
	
}

int main(void) {

	dq1.assign(8, 0);
	dq2.assign(8, 0);
	dq3.assign(8, 0);
	dq4.assign(8, 0);

	int tc; // 회전 횟수

	// 톱니바퀴 입력받기
	int temp;
	cin >> temp;
	int mul = 10;
	for (int j = 7; j >= 0; j-- ) {
		dq1[j] = temp % mul; // 나머지
		temp = temp / mul; //몫
	}
	cin >> temp;
	mul = 10;
	for (int j = 7; j >= 0; j--) {
		dq2[j] = temp % mul; // 나머지
		temp = temp / mul; //몫
	}
	cin >> temp;
	mul = 10;
	for (int j = 7; j >= 0; j--) {
		dq3[j] = temp % mul; // 나머지
		temp = temp / mul; //몫
	}
	cin >> temp;
	mul = 10;
	for (int j = 7; j >= 0; j--) {
		dq4[j] = temp % mul; // 나머지
		temp = temp / mul; //몫
	}

	cin >> tc;

	// 입력값에 맞게 해당 바퀴와 인접한 바퀴 회전시키기.
	for (int i = 0; i < tc; i++) {
		int wheel_num;
		int clockwise;
		cin >> wheel_num >> clockwise;

		rotateWheel(wheel_num,clockwise,0);
	}

	// 네 톱니바퀴의 점수의 합
	int res = 0;
	if (dq1[0]) { // s극이면
		res += 1;
	}
	if (dq2[0]) {
		res += 2;
	}
	if (dq3[0]) {
		res += 4;
	}
	if (dq4[0]) {
		res += 8;
	}

	cout << res;

	return 0;
}
반응형