Study hard

(c++)백준 14891번: 톱니바퀴 본문

백준/시뮬레이션,구현

(c++)백준 14891번: 톱니바퀴

Nimgnoej 2021. 4. 5. 16:10

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

[풀이]

문제에 나온 톱니바퀴의 회전 규칙을 구현하는 문제였다.

 

w[n][i]에 n번 톱니바퀴의 i번째 칸의 극을 저장하였다. 그리고 K번 톱니바퀴 번호와 방향을 받을때마다 톱니바퀴들을 회전시켰다.

 

2번 톱니바퀴를 회전시킨다고 할 때  w[2][6]과 w[1][2]가 같으면 1번 톱니바퀴도 같이 반대방향으로 회전해야한다. 그리고 w[2][2]와 w[3][6]이 같으면 3번 톱니바퀴도 회전해야한다. 

→재귀함수로 구현하였다. 한번 회전한 톱니바퀴를 다시 회전시키면 안되므로 bool turned[]배열을 이용하여 표시해주었다.

 

※톱니바퀴 상태는 띄어쓰지 않고 주어지기 따문에 scanf를 사용하기!

#include <iostream>
#include <cstring>//memset
#include <cstdio>//scanf
using namespace std;

int K;
int w[5][8];//톱니바퀴
bool turned[5];

void Turn(int n, int d) {
	int t = w[n][2];
	int s = w[n][6];
	turned[n] = true;
	//시계방향
	if (d == 1) {
		int tmp = w[n][7];
		for (int i = 6; i >= 0; i--)
			w[n][i + 1] = w[n][i];
		w[n][0] = tmp;
	}
	//시계반대방향
	else {
		int tmp = w[n][0];
		for (int i = 1; i <= 7; i++)
			w[n][i - 1] = w[n][i];
		w[n][7] = tmp;
	}
	//양쪽 톱니바퀴의 맞닿은 부분이 다른극이면
	if (n != 4 && t != w[n + 1][6] && turned[n + 1] == false)
		Turn(n + 1, -d);
	if (n != 1 && s != w[n - 1][2] && turned[n - 1] == false)
		Turn(n - 1, -d);
}

int getScore() {
	int res = 0;
	if (w[1][0] == 1)
		res += 1;
	if (w[2][0] == 1)
		res += 2;
	if (w[3][0] == 1)
		res += 4;
	if (w[4][0] == 1)
		res += 8;
	return res;
}

int main() {
	for (int i = 1; i <= 4; i++) {
		for (int j = 0; j < 8; j++) {
			scanf("%1d", &w[i][j]);
		}
	}
	cin >> K;
	int n, d;
	while (K--) {
		cin >> n >> d;
		memset(turned, false, sizeof(turned));
		Turn(n, d);
	}
	cout << getScore() << '\n';
	return 0;
}