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

[백준 15662] 톱니바퀴2

by m2162003 2021. 3. 1.

이전 톱니바퀴 문제와 유사하다.

조건만 다른데

이번엔 톱니가 t개이고

회전 조건은: 옆 톱니가 회전하고 + 맞닿아있는 전극이 서로 다를 때 -> 반대 방향으로 회전한다.

 

현재 회전하는 톱니바퀴 좌우로 방향만 저장했다.

마지막에 방향에 따라 각 톱니바퀴를 회전시킨다.

#include <stdio.h>
#define MAX 1001
int t, k;
int arr[MAX][10];
int dirs[MAX];

using namespace std;

void turn(int row, int dir)
{
  if (dir == 1)
  {
    int last = arr[row][7];
    for (int i = 7; i >= 1; i--)
    {
      arr[row][i] = arr[row][i - 1];
    }
    arr[row][0] = last;
  }
  else if (dir == -1)
  {

    int last = arr[row][0];
    for (int i = 0; i < 7; i++)
    {
      arr[row][i] = arr[row][i + 1];
    }
    arr[row][7] = last;
  }
}

int main(void)
{
  scanf("%d", &t);
  for (int i = 1; i <= t; i++)
  {
    for (int j = 0; j < 8; j++)
    {
      scanf("%1d", &arr[i][j]);
    }
  }

  scanf("%d", &k);

  for (int i = 0; i < k; i++)
  {
    int target, dir;
    scanf("%d%d", &target, &dir);
    dirs[target] = dir;
    int tmp_dir = dir;
    for (int j = target + 1; j <= t; j++)
    {
      //이전 톱니가 회전하고 다른 반향이라면 반대 방향으로 회전
      if (tmp_dir != 0 && (arr[j - 1][2] != arr[j][6]))
      {
        tmp_dir *= -1;
      }
      else //아니면 회전 안함
      {
        tmp_dir = 0;
      }
      dirs[j] = tmp_dir;
    }

    //target 기준 오른쪽
    tmp_dir = dir;
    for (int j = target - 1; j >= 1; j--)
    {
      if (tmp_dir != 0 && (arr[j][2] != arr[j + 1][6]))
      {
        tmp_dir *= -1;
      }
      else //아니면 회전 안함
      {
        tmp_dir = 0;
      }
      dirs[j] = tmp_dir;
    }

    //한꺼번에 회전 시키기
    for (int j = 1; j <= t; j++)
    {
      turn(j, dirs[j]);
    }
  }

  int res = 0;
  for (int i = 1; i <= t; i++)
  {
    if (arr[i][0] == 1)
    {
      res++;
    }
  }

  printf("%d", res);

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 11780]플로이드2  (0) 2021.04.11
[백준 20056] 마법사 상어와 파이어볼  (0) 2021.03.31
[백준 1248] 맞춰봐  (0) 2021.03.01
[백준 16986]인싸들의 가위바위보  (0) 2021.03.01
[백준 11652] 카드  (0) 2021.02.25

댓글