작심 24/7

[백준] 14891번 톱니바퀴 본문

백준

[백준] 14891번 톱니바퀴

모닝수박 2020. 7. 1. 02:59
 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 �

www.acmicpc.net

구현이 귀찮은 시뮬레이션 문제이다.

회전해야 하는 톱니바퀴를 먼저 체크해준 후 회전시키는 것이 포인트

 

네 개의 톱니바퀴를 모두 돌린다고 가정할 때

1. 시계 방향, 반시계 방향, 시계 방향, 반시계 방향

2. 반시계 방향, 시계 방향, 반시계 방향, 시계 방향

이렇게 두 가지 경우가 나온다.

 

이것을 이차원 배열 order에 저장해준 뒤

톱니바퀴의 번호와 방향을 입력받으면

1번 경우인지 2번 경우인지 판단해준 다음

 

번호에 따라서 바퀴가 돌아가는 순서대로

ex) 1일 때 1 -> 2 -> 3 -> 4, 3일 때 3 -> 4 -> 2 -> 1

회전하면 안 되는 바퀴이면 order의 값을 0으로 바꿔주고

아니면 값을 그대로 두었다.

 

그러고 order의 값이 0이면 무시,

1이면 시계 방향으로,

-1이면 반시계 방향으로 회전해주었다.

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
int wheel[5][8];
int K, num, direction, res = 0, idx = 0;
void Clockwise(int i) {
	for (int j = 0; j < 7; j++) swap(wheel[i][j], wheel[i][7]);
}
void CounterClockwise(int i) {
	for (int j = 7; j > 0; j--) swap(wheel[i][j], wheel[i][0]);
}
int main() {
	string st;
	for (int i = 1; i <= 4; i++) {
		cin >> st;
		for (int j = 0; j < 8; j++) wheel[i][j] = st[j] - '0';
	}
	cin >> K;
	for (int k = 0; k < K; k++) {
		cin >> num >> direction;
		int order[2][5] = { { 0, 1, -1, 1, -1 },{ 0, -1, 1, -1, 1 } };
		if ((num % 2 == 1 && direction == 1) || (num % 2 == 0 && direction == -1)) idx = 0;
		else idx = 1;
		if (num == 1) {
			for (int i = 2; i <= 4; i++) {
				if (wheel[i][6] == wheel[i - 1][2] || order[idx][i - 1] == 0) order[idx][i] = 0;
			}
		}
		else if (num == 2) {
			if (wheel[num][2] == wheel[num + 1][6]) order[idx][num + 1] = 0;
			if (wheel[num][6] == wheel[num - 1][2]) order[idx][num - 1] = 0;
			if (wheel[num + 2][6] == wheel[num + 1][2] || order[idx][num + 1] == 0) order[idx][num + 2] = 0;
		}
		else if (num == 3) {
			if (wheel[num][2] == wheel[num + 1][6]) order[idx][num + 1] = 0;
			if (wheel[num][6] == wheel[num - 1][2]) order[idx][num - 1] = 0;
			if (wheel[num - 2][2] == wheel[num - 1][6] || order[idx][num - 1] == 0) order[idx][num - 2] = 0;
		}
		else {
			for (int i = 3; i >= 1; i--) {
				if (wheel[i][2] == wheel[i + 1][6] || order[idx][i + 1] == 0) order[idx][i] = 0;
			}
		}
		for (int i = 1; i <= 4; i++) {
			if (order[idx][i] == 1) Clockwise(i);
			else if (order[idx][i] == -1) CounterClockwise(i);
		}
	}
	for (int i = 1; i <= 4; i++) if (wheel[i][0]) res += pow(2, i - 1);
	cout << res;
	return 0;
}

'백준' 카테고리의 다른 글

[백준] 1062번 가르침  (0) 2020.07.02
[백준] 15685번 드래곤 커브  (0) 2020.07.01
[백준] 10835번 카드 게임  (0) 2020.06.29
[백준] 14503번 로봇 청소기  (0) 2020.06.27
[백준] 15748번 Rest Stops  (0) 2020.06.26
Comments