https://www.acmicpc.net/problem/14891
위 문제는 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 |