[C++] 백준 14891 : 톱니바퀴

Kim Nahyeong·2022년 9월 13일
0

백준

목록 보기
137/157

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> b(5, vector<int>(8)); // 톱니바퀴 상태 저장 - 2차원 벡터 선언법
int K;
int n, d; // 톱니바퀴 번호, 방향

// 이동 배열 저장
void move(int n, int d){
  // 시계 방향
  if(d == 1){
    b[n] = {b[n][7], b[n][0], b[n][1], b[n][2], b[n][3], b[n][4], b[n][5], b[n][6]};
  } else if(d == -1){
    // 반시계 방향
    b[n] = {b[n][1], b[n][2], b[n][3], b[n][4], b[n][5], b[n][6], b[n][7], b[n][0]};
  }
}

int reverse(int d){
  if(d == 1){
    return -1;
  } else {
    return 1;
  }
}

void turn(int n, int d){
  int nd = reverse(d);
  if(n == 1){
    if(b[1][2] != b[2][6]){
      if(b[2][2] != b[3][6]){
        if(b[3][2] != b[4][6]){
          move(1, d);
          move(2, nd);
          move(3, d);
          move(4, nd);
        } else {
          move(1, d);
          move(2, nd);
          move(3, d);
        }
      } else {
        move(1, d);
        move(2, nd);
      }
    } else {
      move(1, d);
    }
  } else if(n == 4){
    if(b[3][2] != b[4][6]){
      if(b[2][2] != b[3][6]){
        if(b[1][2] != b[2][6]){
          move(4, d);
          move(3, nd);
          move(2, d);
          move(1, nd);
        } else {
          move(4, d);
          move(3, nd);
          move(2, d);
        }
      } else {
        move(4, d);
        move(3, nd);
      }
    } else {
      move(4, d);
    }
  } else if(n == 2) {
    if(b[1][2] != b[2][6]){
      move(1, nd);
    }

    if(b[2][2] != b[3][6]){
      if(b[3][2] != b[4][6]){
        move(2, d);
        move(3, nd);
        move(4, d);
      } else {
        move(2, d);
        move(3, nd);
      }
    } else {
      move(2, d);
    }
  } else if(n == 3) {
    if(b[3][2] != b[4][6]){
      move(4, nd);
    }

    if(b[2][2] != b[3][6]){
      if(b[1][2] != b[2][6]){
        move(3, d);
        move(2, nd);
        move(1, d);
      } else {
        move(3, d);
        move(2, nd);
      }
    } else {
      move(3, d);
    }
  }
}

int main(int argc, char** argv){
  for(int i = 1; i <= 4; i++){
    for(int j = 0; j < 8; j++){
      // N은 0, S는 1
      scanf("%1d", &b[i][j]);
    }
  }

  scanf("%d", &K);

  for(int i = 0; i < K; i++){
    scanf("%d %d", &n, &d);
    turn(n, d);
  }

  printf("%d", b[1][0] + (2 * b[2][0]) + (4 * b[3][0]) + (8 * b[4][0]));

  return 0;
}

스킬따위 필요하지 않고 진짜 독해와 구현만이 필요했던 문제...

주의

  • 돌아간 이후에 맞닿는 극이 같지 않아도 무시한다.
  • 톱니바퀴가 돌아갈지 여부는 회전이 결정된 당시에 맞닿는 극에 대해 결정된다. 톱니가 돌아가고 그에 따른 맞닿는 극이 연쇄적으로 돌아가는 것이 아니다. 상식으로 생각하지말고 독해를 하자. -> 이래서 진짜 노가다로 모든 경우에 대해서를 조건문으로 세워서 풀었다.

0개의 댓글