[BOJ/C++] 14891(톱니바퀴)

푸른별·2023년 9월 14일
0

Algorithm

목록 보기
41/47
post-thumbnail

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

2. 풀이 과정

  1. 설명을 읽다보면 특별한 알고리즘을 쓰지 않은 구현임을 바로 알 수 있습니다. - 구현
  • 특정 톱니바퀴를 움직일 때, 인접한 톱니바퀴와 맞닿은 톱니의 극이 같다면 이후의 작업은 진행되지 않습니다.

  • 인접한 톱니의 극이 다르다면 다음 톱니바퀴는 기존의 톱니바퀴의 진행방향과 반대되게 진행됩니다.

  • 위 조건들을 인지한 뒤 1번부터 4번 톱니바퀴 중 처음 움직이는 케이스에 따라 다른 톱니바퀴가 어떻게 움직이는지 구현해주면 되는 간단한 문제였습니다.

3. 함수 설명

void normal(int num): num번 톱니바퀴를 시계 방향으로 회전시키는 함수

void abnormal(int num): num번 톱니바퀴를 반시계 방향으로 회전시키는 함수

void query(int num, int dir): 방향이 1로 주어지면 시계 방향으로, -1이 주어지면 반시계 방향으로 회전하도록 하는 함수

void rotate(int num, int dir): num번 톱니바퀴를 dir의 값에 따라 회전합니다. num이 회전한 상황에 따라 1~4번 톱니바퀴의 움직임이 다르므로 조건에 맞게 순서대로 회전하도록 구현한 함수

4. 정답 코드

#include<iostream>
using namespace std;

int k, answer = 0;
int a[5][8];

void input() {
	string s;
	for (int i = 1; i <= 4; ++i) {
		cin >> s;
		for (int j = 0; j < (int)s.length(); ++j) {
			a[i][j] = s[j] - '0';
		}
	}
	cin >> k;
}

void normal(int num) {
	int tmp[8];
	for (int i = 0; i < 8; ++i) {
		tmp[(i + 1) % 8] = a[num][i];
	}
	for (int i = 0; i < 8; ++i) {
		a[num][i] = tmp[i];
	}
}

void abnormal(int num) {
	int tmp[8];
	for (int i = 0; i < 8; ++i) {
		tmp[(i + 7) % 8] = a[num][i];
	}
	for (int i = 0; i < 8; ++i) {
		a[num][i] = tmp[i];
	}
}

void query(int num, int dir) {
	if (dir == 1) {
		normal(num);
	}
	else {
		abnormal(num);
	}
}

void rotate(int num, int dir) {
	int left = a[num][6], right = a[num][2];
	switch (num) {
	case 1:
		query(1, dir);
		if (right == a[2][6]) break;
		right = a[2][2];
		query(2, -dir);
		if (right == a[3][6]) break;
		right = a[3][2];
		query(3, dir);
		if (right == a[4][6]) break;
		query(4, -dir);
		break;
	case 2:
		query(2, dir);
		if (left != a[1][2]) {
			query(1, -dir);
		}
		if (right == a[3][6]) break;
		right = a[3][2];
		query(3, -dir);
		if (right == a[4][6]) break;
		query(4, dir);
		break;
	case 3:
		query(3, dir);
		if (right != a[4][6]) {
			query(4, -dir);
		}
		if (left == a[2][2]) break;
		left = a[2][6];
		query(2, -dir);
		if (left == a[1][2]) break;
		query(1, dir);
		break;
	case 4:
		query(4, dir);
		if (left == a[3][2]) break;
		left = a[3][6];
		query(3, -dir);
		if (left == a[2][2]) break;
		left = a[2][6];
		query(2, dir);
		if (left == a[1][2]) break;
		query(1, -dir);
	}
}

void solution() {
	input();
	int num, dir;
	for (int i = 0; i < k; ++i) {
		cin >> num >> dir;
		rotate(num, dir);
	}
	for (int i = 0; i < 4; ++i) {
		if (a[i + 1][0] == 1) {
			answer += (1 << i);
		}
	}
	cout << answer;
}

int main() {
	cin.tie(0), cout.tie(0);
	ios_base::sync_with_stdio(0);
	solution();
	return 0;
}

profile
묵묵히 꾸준하게

0개의 댓글