Coding_Test_C++

BaekJoon 14891번: 톱니바퀴(C++)

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

풀이법

1) 깔끔한 풀이를 기대하고 들어왔다면.. 죄송하지만 해당 풀이는 도움이 크게 되지는 않습니다.

2) Deque을 사용하면 더 쉽게 풀 수 있다는 것을 문제를 보고 눈치 챘지만, 안 쓴지 너무 오래되었으며 검색 없이 정해준 30분이라는 시간 제한 내에 어떻게든 풀기 위해 조건을 빡 구현하여 배열로 문제를 풀었습니다.

3) checkOne, CheckTwo, CheckThree 라는 bool 변수를 두어서 톱니가 회전하는지를 확인하고 모든 경우의 수를 if-else로 구현해서 문제를 맞출 수 있었습니다.

4) 단순한 구현이 전부인 문제이기에 if-else로 문제를 풀려고 하시는 분들께서는 코드를 보심이 더 이해가 쉬우실 겁니다.

#include <string>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include <math.h>
using namespace std;

int arr[8][5];
int k;
void rotRight(int which)
{
	int now = arr[7][which];
	for (int i = 7; i >=1; i--)
	{
		arr[i][which] = arr[i - 1][which];
	}
	arr[0][which] = now;
}
void rotLeft(int which)
{
	int now = arr[0][which];
	for (int i = 1; i <= 7; i++)
	{
		arr[i-1][which] = arr[i][which];
	}
	arr[7][which] = now;
}
void rotate(int which, int dir)
{
	bool checkOne = false;//1번 톱니 2번, 2번 톱니 6번
	bool checkTwo = false;//2번 톱니 2번, 3번 톱니 6번
	bool checkThree = false;//3번 톱니 2번, 4번 톱니 6번
	if (arr[2][1] != arr[6][2])
		checkOne = true;
	if (arr[2][2] != arr[6][3])
		checkTwo = true;
	if (arr[2][3] != arr[6][4])
		checkThree = true;
	if (dir == 1)//시계
	{
		rotRight(which);
		if (which == 1)
		{
			if (checkOne == true)
			{
				rotLeft(which + 1);
				if (checkTwo == true)
				{
					rotRight(which + 2);
					if (checkThree == true)
						rotLeft(which + 3);
				}

			}
		}
		else if (which == 2)
		{
			if (checkOne == true)
			{
				rotLeft(which - 1);
			}
			if (checkTwo == true)
			{
				rotLeft(which + 1);
				if (checkThree == true)
				{
					rotRight(which + 2);
				}
			}
		}
		else if (which == 3)
		{
			if (checkTwo== true)
			{
				rotLeft(which - 1);
				if (checkOne == true)
					rotRight(which - 2);
			}
			if (checkThree == true)
			{
				rotLeft(which + 1);
				
			}
		}
		else
		{
			if (checkThree == true)
			{
				rotLeft(which - 1);
				if (checkTwo == true)
				{
					rotRight(which - 2);
					if (checkOne == true)
						rotLeft(which - 3);
				}
			}
		}
	}
	else
	{
		rotLeft(which);
		if (which == 1)
		{
			if (checkOne == true)
			{
				rotRight(which + 1);
				if (checkTwo == true)
				{
					rotLeft(which + 2);
					if (checkThree == true)
						rotRight(which + 3);
				}

			}
		}
		else if (which == 2)
		{
			if (checkOne == true)
			{
				rotRight(which - 1);
			}
			if (checkTwo == true)
			{
				rotRight(which + 1);
				if (checkThree == true)
				{
					rotLeft(which + 2);
				}
			}
		}
		else if (which == 3)
		{
			if (checkTwo == true)
			{
				rotRight(which - 1);
				if (checkOne == true)
					rotLeft(which - 2);
			}
			if (checkThree == true)
			{
				rotRight(which + 1);

			}
		}
		else
		{
			if (checkThree == true)
			{
				rotRight(which - 1);
				if (checkTwo == true)
				{
					rotLeft(which - 2);
					if (checkOne == true)
						rotRight(which - 3);
				}
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	for (int i = 1; i <= 4; i++)
	{
		string s; cin >> s;
		for (int j = 0; j < s.size(); j++) {
			arr[j][i] = (s[j] - '0');
		}
	}
	cin >> k;
	for (int t = 0; t < k; t++) {
		int a, b; cin >> a >> b;
		rotate(a, b);
	}
	int ans = 0;
	for (int i = 1; i <= 4; i++)
	{
		if (arr[0][i]==1)
		{
			ans += (int)(pow(2, i-1));
		}
	}
	cout << ans;

}