본문 바로가기

백준 문제 풀이

백준 14891번 톱니바퀴 (C++)

728x90

 얼핏 봤을때 삼성 문제 답게 그래프인가? 싶었는데 그냥 쌩구현이었다. 

난 백준을 풀 때 웬만하면 100줄을 넘는 코드는 좋지않은 코드라고 생각하는데 무려 200줄이다. 허허,,, 반복을 잘 하면 줄일 수 있을 것 같은데 일단 내 최선이다.

아마 이 문제를 틀린 사람들의 이유는 다음과 같을 것이다.

"톱니바퀴가 움직인 후" 옆의 톱니바퀴와 비교하는 것이 아니라

"톱니바퀴가 움직이기 전" 옆의 톱니바퀴와 비교하여 움직일지 말지 정하는 문제이다.

 

이 문제는 톱니바퀴가 고작 4개여서 노가다로 풀 수 있었지만 톱니바퀴가 5개만 되어도 힘들것이다. 뭔가 일반화된 식이 있을까 고민된다.

 

1. 시계방향이동 함수 구현

2. 반시계방향이동 함수 구현

3. 톱니들의 규칙에 맞는 함수 구현

 

#include <iostream>

using namespace std;

char w1[8];
char w2[8];
char w3[8];
char w4[8];

void clockmove(char *w) {
	char tmp;
	tmp = w[0];
	w[0] = w[7];
	w[7] = w[6];
	w[6] = w[5];
	w[5] = w[4];
	w[4] = w[3];
	w[3] = w[2];
	w[2] = w[1];
	w[1] = tmp;
}

void reversclockmove(char* w) {
	char tmp;
	tmp = w[0];
	w[0] = w[1];
	w[1] = w[2];
	w[2] = w[3];
	w[3] = w[4];
	w[4] = w[5];
	w[5] = w[6];
	w[6] = w[7];
	w[7] = tmp;
}

int main() {
	string tmp;
	cin >> tmp;
	for (int j = 0; j < 8; j++)
		w1[j] = tmp[j];
	cin >> tmp;
	for (int j = 0; j < 8; j++)
		w2[j] = tmp[j];
	cin >> tmp;
	for (int j = 0; j < 8; j++)
		w3[j] = tmp[j];
	cin >> tmp;
	for (int j = 0; j < 8; j++)
		w4[j] = tmp[j];

	int n, number, dir;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> number >> dir;
		if (dir == 1) {
			if (number == 1) {
				if (w1[2] != w2[6]) {
					if (w2[2] != w3[6]) {
						if (w3[2] != w4[6]) {
							clockmove(w1);
							reversclockmove(w2);
							clockmove(w3);
							reversclockmove(w4);
						}
						else {
							clockmove(w1);
							reversclockmove(w2);
							clockmove(w3);
						}
					}
					else {
						clockmove(w1);
						reversclockmove(w2);
					}
				}
				else
					clockmove(w1);
			}
			else if (number == 2) {
				if (w2[6] != w1[2]) {
					reversclockmove(w1);
				}
				if (w2[2] != w3[6]) {
					if (w3[2] != w4[6]) {
						clockmove(w2);
						reversclockmove(w3);
						clockmove(w4);
					}
					else {
						clockmove(w2);
						reversclockmove(w3);
					}
				}
				else
					clockmove(w2);
			}
			else if (number == 3) {
				if (w3[2] != w4[6]) {
					reversclockmove(w4);
				}
				if (w3[6] != w2[2]) {
					if (w2[6] != w1[2]) {
						clockmove(w3);
						reversclockmove(w2);
						clockmove(w1);
					}
					else {
						clockmove(w3);
						reversclockmove(w2);
					}
				}
				else
					clockmove(w3);
			}
			else if (number == 4) {
				if (w4[6] != w3[2]) {
					if (w3[6] != w2[2]) {
						if (w2[6] != w1[2]) {
							clockmove(w4);
							reversclockmove(w3);
							clockmove(w2);
							reversclockmove(w1);
						}
						else {
							clockmove(w4);
							reversclockmove(w3);
							clockmove(w2);
						}
					}
					else {
						clockmove(w4);
						reversclockmove(w3);
					}
				}
				else {
					clockmove(w4);
				}
			}
		}
		else {
			if (number == 1) {
				if (w1[2] != w2[6]) {
					if (w2[2] != w3[6]) {
						if (w3[2] != w4[6]) {
							reversclockmove(w1);
							clockmove(w2);
							reversclockmove(w3);
							clockmove(w4);
						}
						else {
							reversclockmove(w1);
							clockmove(w2);
							reversclockmove(w3);
						}
					}
					else {
						reversclockmove(w1);
						clockmove(w2);
					}
				}
				else
					reversclockmove(w1);
			}
			else if (number == 2) {
				if (w2[6] != w1[2]) {
					clockmove(w1);
				}
				if (w2[2] != w3[6]) {
					if (w3[2] != w4[6]) {
						reversclockmove(w2);
						clockmove(w3);
						reversclockmove(w4);
					}
					else {
						reversclockmove(w2);
						clockmove(w3);
					}
				}
				else
					reversclockmove(w2);
			}
			else if (number == 3) {
				if (w3[2] != w4[6]) {
					clockmove(w4);
				}
				if (w3[6] != w2[2]) {
					if (w2[6] != w1[2]) {
						reversclockmove(w3);
						clockmove(w2);
						reversclockmove(w1);
					}
					else {
						reversclockmove(w3);
						clockmove(w2);
					}
				}
				else
					reversclockmove(w3);
			}
			else if (number == 4) {
				if (w4[6] != w3[2]) {
					if (w3[6] != w2[2]) {
						if (w2[6] != w1[2]) {
							reversclockmove(w4);
							clockmove(w3);
							reversclockmove(w2);
							clockmove(w1);
						}
						else {
							reversclockmove(w4);
							clockmove(w3);
							reversclockmove(w2);
						}
					}
					else {
						reversclockmove(w4);
						clockmove(w3);
					}
				}
				else {
					reversclockmove(w4);
				}
			}
		}
	}
	int answer = 0;
	if (w1[0] == '1')
		answer += 1;
	if (w2[0] == '1')
		answer += 2;
	if (w3[0] == '1')
		answer += 4;
	if (w4[0] == '1')
		answer += 8;

	cout << answer << '\n';
}