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


[ 알고리즘풀이 ]

1. 톱니바퀴의 상태를 12시부터 시계방향으로 배열에 저장합니다.

( chain[a][b] : a번 톱니바퀴의 12시 시계방향 기준으로 b번 째 톱니 )

2. 입력된 회전 명령에 의해 회전되는 톱니바퀴들을 check 해야합니다.

 direction[ ] 배열을 선언해, i번 톱니바퀴가 회전을 해야 되는지, 해야 한다면 시계방향인지 반시계 방향인지 저장합니다.

 이때, a번 톱니바퀴가 b( 시계방향이면1, 반시계 방향이면 -1)로 회전해야 한다면 (a + 1)번 톱니바퀴는 a번과 맞닿는 부분에 따라서 회전해야 한다면 -b 방향으로 회전해야 합니다.

		// 오른쪽 check.
		for (int i = a; i < 4; i++)
			if (chain[i][2] != chain[i + 1][6])
				direction[i + 1] = -direction[i];
		// 왼쪽 check.
		for (int i = a; i > 1; i--) {
			if (chain[i][6] != chain[i - 1][2])
				direction[i - 1] = -direction[i];
		}

 즉, 다음과 같이 a번 톱니바퀴에서 오른쪽으로 체크, 왼쪽으로 체크해서 direction[ ] 배열을 채워나갈 수 있습니다.

3. direction[ ] 배열을 통해 우리는 몇 번 톱니바퀴를 어떻게 회전해야 되는지 알 수 있으므로, turn 함수를 통해 톱니바퀴를 돌려줍니다.

4. 2~3 과정을 반복해 모든 회전 명령을 다 수행했다면 점수를 계산해주면 됩니다.

#include<iostream>
#include<string>

using namespace std;

int chain[5][8] = {}, t, a, b;
string input;

void turn(int a, int dir) {
	int temp;
	if(dir == 1){
		temp = chain[a][7];
		for (int i = 7; i > 0; i--)
			chain[a][i] = chain[a][i - 1];
		chain[a][0] = temp;
	}
	else {
		temp = chain[a][0];
		for (int i = 0; i < 7; i++)
			chain[a][i] = chain[a][i + 1];
		chain[a][7] = temp;
	}
	return;
}

int getScore(void) {
	int ans = 0, mul = 1;
	for (int i = 1; i <= 4; i++){
		if (chain[i][0] == 1)
			ans += mul;
		mul *= 2;
	}
	return ans;
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);


	for (int i = 1; i <= 4; i++) {
		cin >> input;
		for (int j = 0; j < 8; j++)
			chain[i][j] = (input[j] - '0');
	}

	cin >> t;
	while (t--) {
		cin >> a >> b;
		// 1-2 2-3 3-4 톱니바퀴가 회전해야되는지 체크.
		int direction[5] = {};
		direction[a] = b;
		// 오른쪽 check.
		for (int i = a; i < 4; i++)
			if (chain[i][2] != chain[i + 1][6])
				direction[i + 1] = -direction[i];
		// 왼쪽 check.
		for (int i = a; i > 1; i--) {
			if (chain[i][6] != chain[i - 1][2])
				direction[i - 1] = -direction[i];
		}
		for (int i = 1; i < 5; i++) {
			if (direction[i])
				turn(i, direction[i]);
		}
	}
	cout << getScore() << '\n';

	return 0;
}

 

+ Recent posts