알고리즘/백준

백준 14891번 톱니바퀴 C/C++ 풀이

Chavo Kim 2020. 8. 5. 22:27

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

이 역시 시뮬레이션 문제.

하드한 원자 소멸 시뮬레이션 풀고 오니 간단하게 풀었던 문제.

시계 방향과 반시계 방향의 회전을 구현하기 위해서 deque(덱) 자료구조를 사용하였다.

 

deque(덱)이 궁금하다면 여기로

 

#include <cstdio>
#include <deque>
#include <utility>

using namespace std;

//입력이 길면 귀찮아서 file로 받음
FILE* in = fopen("input.txt", "r");

int k;
//각각의 톱니바퀴를 deque으로 구현
deque<int> fir;
deque<int> sec;
deque<int> thi;
deque<int> fou;
//각 톱니바퀴 사이에 극이 다른지를 확인하는 boolean 배열
bool diff[3];

//diff 배열을 갱신하기 위한 함수
void is_diff() {
	diff[0] = (fir[2] != sec[6]);
	diff[1] = (sec[2] != thi[6]);
	diff[2] = (thi[2] != fou[6]);
}

// 회전을 구현하기 위한 함수, c에 0이 들어왔을 때에는 어떠한 변화도 일어나지 않음
void turn(deque<int>& wheel, int c) {
	if (c == -1)
	{
		wheel.push_back(wheel[0]);
		wheel.pop_front();
	}
	else if (c == 1)
	{
		wheel.push_front(wheel[7]);
		wheel.pop_back();
	}
}

// 입력값이 주어졌을 때 변화를 내기 위한 함수
void start(int b, int c) {
	//방향값을 모두 0으로 초기화
	int d1 = 0, d2 = 0, d3 = 0, d4 = 0;
    // 돌리는 톱니바퀴가 어떤 톱니바퀴인지 판별
	switch (b) {
	case 1:
		d1 = c;
        //diff의 값에 따라 방향이 결정. 없을 경우 0으로 되어 회전이 일어나지 않음.
		if (diff[0])
			d2 = -d1;
		if (diff[1])
			d3 = -d2;
		if (diff[2])
			d4 = -d3;
		break;
	case 2:
		d2 = c;
		if (diff[0])
			d1 = -d2;
		if (diff[1])
			d3 = -d2;
		if (diff[2])
			d4 = -d3;
		break;
	case 3:
		d3 = c;
		if (diff[2])
			d4 = -d3;
		if (diff[1])
			d2 = -d3;
		if (diff[0])
			d1 = -d2;
		break;
	case 4:
		d4 = c;
		if (diff[2])
			d3 = -d4;
		if (diff[1])
			d2 = -d3;
		if (diff[0])
			d1 = -d2;
		break;
	}
	turn(fir, d1);
	turn(sec, d2);
	turn(thi, d3);
	turn(fou, d4);
    //모두 돌려준 후 diff 배열 갱신
	is_diff();
}

int main() {
	//입력
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			int a;
			fscanf(in, "%1d", &a);
			switch (i) {
				case 0 :
					fir.push_back(a);
					break;
				case 1:
					sec.push_back(a);
					break;
				case 2:
					thi.push_back(a);
					break;
				case 3:
					fou.push_back(a);
					break;
			}
		}
	}
	is_diff();
	fscanf(in, "%d", &k);
	for (int i = 0; i < k; i++)
	{
		int b, c;
		fscanf(in, "%d %d", &b, &c);
		start(b, c);
	}
	int ans = 0;
	ans += fir[0];
	ans += (2 * sec[0]);
	ans += (4 * thi[0]);
	ans += (8 * fou[0]);
	printf("%d", ans);
	return 0;
}