728x90

삼성 SW 역량 테스트 기출 문제인 14891번 문제

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

나보다 더 노가다로 푼 사람이 있을까 싶을 정도다

#include <iostream>
#include <string>
using namespace std;


int main() {
	string wheel[4];
	int left[4];
	int right[4];
	for (int i = 0; i < 4; i++) {
		cin >> wheel[i];
		left[i] = 6;
		right[i] = 2;
	}
	int k;
	cin >> k;
	int* wheelNum = new int[k];
	int* direction = new int[k];
	for (int i = 0; i < k; i++) {
		int temp;
		cin >> temp;
		cin >> direction[i];
		wheelNum[i] = temp - 1;
	}
	for (int i = 0; i < k; i++) {
		if (wheelNum[i] == 0) { //0번 톱니바퀴인 경우
			if (direction[i] == 1) { //시계 방향인 경우
				if (wheel[0][right[0]] != wheel[1][left[1]]) { //오른쪽 톱니바퀴(1번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 1번이 시계 반대 방향으로 돌아야 함
					if (wheel[1][right[1]] != wheel[2][left[2]]) { //1번과 2번 톱니바퀴가 맞닿는 부분이 다른 극이면 2번 톱니바퀴가 시계방향으로 돌아야 함
						if (wheel[2][right[2]] != wheel[3][left[3]]) { //2번 톱니바퀴와 3번 톱니바퀴가 맞닿는 부분이 다른 극이면 3번이 시계반대방향으로 돌아야 함
							right[3] = (right[3] + 1) % 8;
							left[3] = (left[3] + 1) % 8;
						}
						right[2] = (right[2] - 1 + 8) % 8;
						left[2] = (left[2] - 1 + 8) % 8;
					}
					left[1] = (left[1] + 1) % 8;
					right[1] = (right[1] + 1) % 8;
				}
				right[0] = (right[0] - 1 + 8) % 8;
				left[0] = (left[0] - 1 + 8) % 8;
			}
			else { //시계 반대 방향인 경우
				if (wheel[0][right[0]] != wheel[1][left[1]]) { //오른쪽 톱니바퀴(1번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 시계 방향으로 돌아야 함
					if (wheel[1][right[1]] != wheel[2][left[2]]) { //1번 톱니바퀴와 2번 톱니바퀴가 맞닿는 부분이 다른 극이면 2번 톱니바퀴가 시계반대방향으로 돌아야 함
						if (wheel[2][right[2]] != wheel[3][left[3]]) { //2번 톱니바퀴와 3번 톱니바퀴가 맞닿는 부분이 다른 극이면 3번이 시계방향으로 돌아야 함
							right[3] = (right[3] - 1 + 8) % 8;
							left[3] = (left[3] - 1 + 8) % 8;
						}
						right[2] = (right[2] + 1) % 8;
						left[2] = (left[2] + 1) % 8;
					}
					left[1] = (left[1] - 1 + 8) % 8;
					right[1] = (right[1] - 1 + 8) % 8;
				}
				right[0] = (right[0] + 1) % 8;
				left[0] = (left[0] + 1) % 8;
			}
		}






		else if (wheelNum[i] == 1) {
			if (direction[i] == 1) { //시계 방향인 경우
				if (wheel[1][right[1]] != wheel[2][left[2]]) { //시계 반대 방향으로 돌아야 함
					if (wheel[2][right[2]] != wheel[3][left[3]]) {
						left[3] = (left[3] - 1 + 8) % 8;
						right[3] = (right[3] - 1 + 8) % 8;
					}
					left[2] = (left[2] + 1) % 8;
					right[2] = (right[2] + 1) % 8;
				}
				if (wheel[0][right[0]] != wheel[1][left[1]]) { //왼쪽 톱니바퀴(0번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 시계 반대 방향으로 돌아야 함
					left[0] = (left[0] + 1) % 8;
					right[0] = (right[0] + 1) % 8;
				}
				right[1] = (right[1] - 1 + 8) % 8;
				left[1] = (left[1] - 1 + 8) % 8;
			}
			else { //1번 톱니바퀴이고 반시계 방향인 경우
				if (wheel[1][right[1]] != wheel[2][left[2]]) { //시계 방향으로 돌아야 함
					if (wheel[2][right[2]] != wheel[3][left[3]]) {
						left[3] = (left[3] + 1) % 8;
						right[3] = (right[3] + 1) % 8;
					}
					left[2] = (left[2] - 1 + 8) % 8;
					right[2] = (right[2] - 1 + 8) % 8;
				}
				if (wheel[0][right[0]] != wheel[1][left[1]]) { //왼쪽 톱니바퀴(0번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 시계 방향으로 돌아야 함
					left[0] = (left[0] - 1 + 8) % 8;
					right[0] = (right[0] - 1 + 8) % 8;
				}
				right[1] = (right[1] + 1) % 8;
				left[1] = (left[1] + 1) % 8;
			}
		}
		else if (wheelNum[i] == 2) { //2번 톱니바퀴인 경우
			if (direction[i] == 1) { //시계 방향인 경우
				if (wheel[2][right[2]] != wheel[3][left[3]]) { //오른쪽 톱니바퀴(3번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 3번 톱니바퀴가 시계 반대 방향으로 돌아야 함
					left[3] = (left[3] + 1) % 8;
					right[3] = (right[3] + 1) % 8;
				}
				if (wheel[2][left[2]] != wheel[1][right[1]]) { //왼쪽 톱니바퀴(1번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 시계 반대 방향으로 돌아야 함
					if (wheel[0][right[0]] != wheel[1][left[1]]) { //0번 톱니바퀴와 1번 톱니바퀴가 맞닿는 부분이 다른 극이면 0번 톱니바퀴가 시계방향으로 돌아야 함
						right[0] = (right[0] - 1 + 8) % 8;
						left[0] = (left[0] - 1 + 8) % 8;
					}
					left[1] = (left[1] + 1) % 8;
					right[1] = (right[1] + 1) % 8;
				}
				right[2] = (right[2] - 1 + 8) % 8;
				left[2] = (left[2] - 1 + 8) % 8;
			}
			else { //2번 톱니바퀴이고 반시계 방향인 경우
				if (wheel[2][right[2]] != wheel[3][left[3]]) { //오른쪽 톱니바퀴(3번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 3번 톱니바퀴가 시계 방향으로 돌아야 함
					left[3] = (left[3] - 1 + 8) % 8;
					right[3] = (right[3] - 1 + 8) % 8;
				}
				if (wheel[2][left[2]] != wheel[1][right[1]]) { //왼쪽 톱니바퀴(1번 톱니바퀴)와 맞닿는 부분이 다른 극일 때 시계 방향으로 돌아야 함
					if (wheel[0][right[0]] != wheel[1][left[1]]) { //0번 톱니바퀴와 1번 톱니바퀴가 맞닿는 부분이 다른 극이면 0번 톱니바퀴가 시계반대방향으로 돌아야 함
						right[0] = (right[0] + 1) % 8;
						left[0] = (left[0] + 1) % 8;
					}
					left[1] = (left[1] - 1 + 8) % 8;
					right[1] = (right[1] - 1 + 8) % 8;
				}
				right[2] = (right[2] + 1) % 8;
				left[2] = (left[2] + 1) % 8;
			}
		}
		else { //3번 톱니바퀴인 경우
			if (direction[i] == 1) { //시계 방향인 경우
				if (wheel[3][left[3]] != wheel[2][right[2]]) { //2가 시계반대 방향으로 돌아야 함
					if (wheel[1][right[1]] != wheel[2][left[2]]) { //1이 시계 방향으로 돌아야 함
						if (wheel[0][right[0]] != wheel[1][left[1]]) { //0이 시계 반대 방향으로 돌아야 함
							right[0] = (right[0] + 1) % 8;
							left[0] = (left[0] + 1) % 8;
						}
						right[1] = (right[1] - 1 + 8) % 8;
						left[1] = (left[1] - 1 + 8) % 8;
					}
					left[2] = (left[2] + 1) % 8;
					right[2] = (right[2] + 1) % 8;
				}
				right[3] = (right[3] - 1 + 8) % 8;
				left[3] = (left[3] - 1 + 8) % 8;
			}
			else { //시계 반대 방향인 경우
				if (wheel[3][left[3]] != wheel[2][right[2]]) { //2가 시계방향으로 돌아야 함
					if (wheel[1][right[1]] != wheel[2][left[2]]) { //1이 시계 반대 방향으로 돌아야 함
						if (wheel[0][right[0]] != wheel[1][left[1]]) { //0이 시계 방향으로 돌아야 함
							right[0] = (right[0] - 1 + 8) % 8;
							left[0] = (left[0] - 1 + 8) % 8;
						}
						right[1] = (right[1] + 1) % 8;
						left[1] = (left[1] + 1) % 8;
					}
					left[2] = (left[2] - 1 + 8) % 8;
					right[2] = (right[2] - 1 + 8) % 8;
				}
				right[3] = (right[3] + 1) % 8;
				left[3] = (left[3] + 1) % 8;
			}
		}
	}
	int sum = 0;
	if (wheel[0][(left[0] + 2) % 8] == '1') {
		sum += 1;
	}
	if (wheel[1][(left[1] + 2) % 8] == '1') {
		sum += 2;
	}
	if (wheel[2][(left[2] + 2) % 8] == '1') {
		sum += 4;
	}
	if (wheel[3][(left[3] + 2) % 8] == '1') {
		sum += 8;
	}
	cout << sum << endl;
	return 0;
}
728x90

+ Recent posts