본문 바로가기
Problem Solving

[BOJ 14891] 톱니바퀴

by Ladun 2020. 3. 25.

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

 

14891번: 톱니바퀴

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

www.acmicpc.net


위 문제는 N번 톱니바퀴를 회전한 후, 각 톱니바퀴의 12시 방향의 극에 따라 점수를 계산하는 문제이다.

 

주어지는 입력은 톱니바퀴의 정보, 회전 수, 회전 정보가 주어진다.

 

회전할 때는 주변에 서로 맞닿은 부분의 극에 따라 같이 회전하는지 아니면 회전하지 않는지가 정해진다.

 

문제를 푸는 방법은

1. 처음에 각 톱니바퀴의 12시방향에 해당하는 인덱스를 저장해둔다.

      -> 처음에는 주어진 정보의 0번째까 12시 방향이다.

2. 톱니바퀴를 회전할 때 맞닿은 부분의 극에 따라 양 옆에 톱니바퀴도 회전한다.

3. 시계방향으로 회전할 때는 현재 극의 왼쪽이 12시가 되고 반시계 방향일 때는 오른쪽의 극이 12시가 된다.

4. 이후에 점수를 계산한다.

 


 

#include <stdio.h>

char gear[4][9];
int gear12[4] = { 0, };

void Turn(int index, int dir,int beforeIndex)
{
	if (index > 0 && index - 1 != beforeIndex)
		if (gear[index][(gear12[index] + 6) % 8] != gear[index - 1][(gear12[index - 1] + 2) % 8])
			Turn(index - 1, dir * -1, index);
	if (index < 3 && index + 1 != beforeIndex)
		if (gear[index][(gear12[index] + 2) % 8] != gear[index + 1][(gear12[index + 1] + 6) % 8])
			Turn(index + 1, dir * -1, index);

	if (dir > 0)
		gear12[index] = (gear12[index] + 7) % 8;
	else
		gear12[index] = (gear12[index] + 1) % 8;
		
}

int main()
{
	int N;
	int index, dir;
	int sum = 0;

	for (int i = 0; i < 4; i++)
	{
		scanf("%s", gear[i]);
	}
	scanf("%d", &N);

	for (int i = 0; i < N; i++)
	{
		scanf("%d %d", &index, &dir);

		Turn(index - 1, dir, -1);
	}

	for (int i = 0; i < 4; i++)
	{
		sum += (gear[i][gear12[i]] - '0') << i;
	}

	printf("%d", sum);


}

'Problem Solving' 카테고리의 다른 글

[BOJ 17144] 미세먼지 안녕!  (0) 2020.03.25
[BOJ 15685] 드래곤 커브  (0) 2020.03.25
[BOJ 2193] 이친수  (0) 2020.01.13
[BOJ 1932] 정수 삼각형  (0) 2020.01.13
[BOJ 2884] 알람 시계  (0) 2020.01.03