알고리즘/백준

14891번 톱니바퀴

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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다. 톱니바퀴를 회전시키려

www.acmicpc.net

유형: 시뮬레이션

/*
	sol
		for 0이상
			if 6,2 같으면 break
			else 방향left = 방향right *-1
		for 4미만
			if right6 left2같으면 break
			else right = left*-1
		for 
		12시 방향 조사 후 결과에 덧셈

	main
		입력
		sol
*/
#include<iostream>
#include<cstring>
using namespace std;
int circle[4][8];
int cmd[4] = { 0, };
int ans = 0;
void sol(int mid) 
{
	for (int left = mid - 1; left >= 0; left--)
	{
		int right = left + 1;
		if (circle[left][2] == circle[right][6]) break;
		else cmd[left] = cmd[right] * -1;
	}
	for (int right = mid + 1; right < 4; right++)
	{
		int left = right - 1;
		if (circle[right][6] == circle[left][2]) break;
		else cmd[right] = cmd[left] * -1;
	}
	for (int i = 0; i < 4; i++) 
	{
		if (cmd[i] == -1)//반
		{
			int tmp = circle[i][0];
			for (int j = 0; j  < 7; ++j)
			{
				circle[i][j] = circle[i][j + 1];
			}
			circle[i][7] = tmp;
		}
		else if(cmd[i] == 1){//시
			int tmp = circle[i][7];
			for (int j = 7; j-1>=0; j--)
			{
				circle[i][j] = circle[i][j-1];
			}
			circle[i][0] = tmp;
		}
	}
}

int main() {
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 8; j++) {
			scanf("%1d", &circle[i][j]);
		}
	}
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) 
	{
		memset(cmd, 0, sizeof(cmd));
		int mid; 
		cin >> mid; --mid;
		cin >> cmd[mid];
		sol(mid);
	}
	if (circle[0][0] == 1) ans += 1;
	if (circle[1][0] == 1) ans += 2;
	if (circle[2][0] == 1) ans += 4;
	if (circle[3][0] == 1) ans += 8;
	cout << ans;
}

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 16234 인구 이동  (0) 2020.03.13
백준 15686 치킨 배달  (0) 2020.03.13
백준 15685 드래곤 커브  (0) 2020.03.13
15684 사다리 조작  (0) 2020.03.13
15683 감시  (0) 2020.03.12