본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[기출 상] 백준 14891 톱니바퀴

[문제]

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

[풀이]

양방향으로 데이터 입출력이 가능한 deque에 방향을 저장해 회전하도록 한다.

 

[코드]

#include<iostream>
#include<string>
#include<deque>
using namespace std;

deque<char> wheel[4];

void turn_wheel(int num, int dir) { //id톱니 dir방향으로 움직이기
	if (dir == -1) //반시계방향
	{
		wheel[num].push_back(wheel[num][0]);
		wheel[num].pop_front();
	}
	else //시계방향
	{
		wheel[num].push_front(wheel[num][7]);
		wheel[num].pop_back();
	}
}
void solution(int num, int dir) 
{
	char pre_pole = wheel[num][6]; //움직이기 전 왼쪽 극.
	int turn_dir = dir;
	for (int i = num - 1; i >= 0; i--) //움직일 톱니의 왼쪽 톱니 움직이기
	{
	turn_dir *= (-1); //극이 다르면 반대방향으로 회전 
	if (wheel[i][2] == pre_pole) //극이 같은 경우
		break;
	pre_pole = wheel[i][6];
	turn_wheel(i, turn_dir); //톱니 움직이기
	}

	pre_pole = wheel[num][2]; //움직이기 전 오른쪽 극
	turn_dir = dir;
	for (int i = num + 1; i < 4; i++) //움직일 톱니의 오른쪽 톱니 움직이기
	{
	turn_dir *= (-1);
	if (wheel[i][6] == pre_pole) 
		break; //극이 같은 경우
	pre_pole = wheel[i][2];
	turn_wheel(i, turn_dir);
	}

	turn_wheel(num, dir); //해당 톱니 움직이기
}

int main()
{
	for (int i = 0; i < 4; i++) {
		string str;
		cin >> str;
		for (int j = 0; j < str.size(); j++) {
			wheel[i].push_back(str[j]);
		}
	}
	int k;
	cin >> k;
	for (int i = 0; i < k; i++) {
		int num, dir;
		cin >> num >> dir;
		solution(num - 1, dir);
	}

	int base = 1; 
	int total = 0; //n극이면 0점, s극이면 1점.
	for (int i = 0; i < 4; i++) {
		if (wheel[i][0] == '1') //n극은 0, s극은 1
			total += base; //s극이면 1점, 2점, 4점, 8점
		base *= 2;
	}
	cout << total << "\n";
}