문제를 잘못이해해서 애먹었던 문제이다.
마주해있는 톱니의 N,S가 같으면 회전을 하지 않는게 요점이다.
그때 그때 톱니를 돌리는 것이 아니라 방향이 전부 나오면 한번에 톱니바퀴를 돌려줘야 한다.
#include <stdio.h>
#include <cmath>
#define RIGHT 2
#define LEFT 6
using namespace std;
int gear[4][8];
int dir[4];
void rotate(int cur, int dir)
{
int prevVal;
if (dir == 1)
{
prevVal = gear[cur][7];
for (int i = 7; i > 0; i--)
{
gear[cur][i] = gear[cur][i - 1];
}
gear[cur][0] = prevVal;
}
else if (dir == -1)
{
prevVal = gear[cur][0];
for (int i = 1; i < 8; i++)
{
gear[cur][i - 1] = gear[cur][i];
}
gear[cur][7] = prevVal;
}
}
int main(void)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 8; j++)
{
scanf("%1d", &gear[i][j]);
}
}
int t;
scanf("%d", &t);
for (int i = 0; i < t; i++)
{
int g, d;
scanf("%d%d", &g, &d);
int right = gear[g - 1][RIGHT];
dir[g - 1] = d;
int cur = g - 1;
while (++cur < 4) //오른쪽에 있는 톱니바퀴
{
if (dir[cur - 1] == 0)
{
dir[cur] = 0;
}
else
{
if (right != gear[cur][LEFT])
{
dir[cur] = dir[cur - 1] == 1 ? -1 : 1;
}
else
{
dir[cur] = 0;
}
}
right = gear[cur][RIGHT];
}
int left = gear[g - 1][LEFT];
cur = g - 1;
while (--cur > -1) //왼쪽에 있는 톱니바퀴
{
if (dir[cur + 1] == 0)
{
dir[cur] = 0;
}
else
{
if (left != gear[cur][RIGHT])
{
dir[cur] = dir[cur + 1] == 1 ? -1 : 1;
}
else
{
dir[cur] = 0;
}
}
left = gear[cur][LEFT];
}
for (int j = 0; j < 4; j++)
{
if (dir[j] != 0)
{
rotate(j, dir[j]);
}
}
}
int answer = 0;
for (int i = 0; i < 4; i++)
{
answer += (gear[i][0] == 1 ? pow(2, i) : 0);
}
printf("%d\n", answer);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 2293] 동전1 (0) | 2020.11.14 |
---|---|
[백준 16987] 계란으로 계란치기 (0) | 2020.11.12 |
[백준 1182] 부분수열의 합 (0) | 2020.11.05 |
[백준 9663]N-Queen (0) | 2020.11.05 |
[백준 13335] 트럭 (0) | 2020.11.04 |
댓글