본문 바로가기
알고리즘 문제풀이/백준

[백준 14891] 톱니바퀴

by m2162003 2020. 11. 7.

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

문제를 잘못이해해서 애먹었던 문제이다.

마주해있는 톱니의 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

댓글