[BOJ][삼성기출] 14891. 톱니바퀴

gyeong·2021년 3월 8일
0

PS

목록 보기
20/46

풀이 (hard coding ver.)

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>

#define N 0
#define S 1
#define CW 1
#define L 6
#define R 2

using namespace std;

int K, num, dir;
int map[4][8];
int new_map[4][8];
int roate_info[4][3] = { {1, 2, 3}, {0, 2, 3}, {2, 1, 0} };
int is_rotate[4];

void rotate(int num, int dir) {
   is_rotate[num] = 1;
   if (dir == CW) {
     for (int i = 0; i <= 7; i++) new_map[num][(i + 1) % 8] = map[num][i]; 
   } else {
      for (int i = 0; i <= 7; i++) new_map[num][(i + 7) % 8] = map[num][i];
   }
}

void update_map() {
   for (int i = 0; i <= 3; i++) {
      if (is_rotate[i]) {
         for (int j = 0; j <= 7; j++) {
            map[i][j] = new_map[i][j];
         }
      }
   }
}

void slove(int num, int dir) {
   rotate(num, dir);
   if (num == 0) {
      if (map[0][R] != map[1][L]) {
         rotate(1, dir * -1);
         if (map[1][R] != map[2][L]) {
            rotate(2, dir);
            if (map[2][R] != map[3][L]) {
               rotate(3, dir * -1);
            }
         }
      }
   } else if (num == 1) {
      if (map[1][L] != map[0][R]) {
         rotate(0, dir * -1);
      }
      if (map[1][R] != map[2][L]) {
         rotate(2, dir * -1);
         if (map[2][R] != map[3][L]) {
            rotate(3, dir);
         }
      }
   } else if (num == 2) {
      if (map[2][R] != map[3][L]) {
         rotate(3, dir * -1);
      }
      if (map[2][L] != map[1][R]) {
         rotate(1, dir * -1);
         if (map[1][L] != map[0][R]) {
            rotate(0, dir);
         }
      }
   } else {
      if (map[3][L] != map[2][R]) {
         rotate(2, dir * -1);
         if (map[2][L] != map[1][R]) {
            rotate(1, dir);
            if (map[1][L] != map[0][R]) {
               rotate(0, dir * -1);
            }
         }
      }
   }
   update_map();
}

void cal_rst() {
   int sum = 0;
   for (int i = 0; i < 4; i++) {
      if (map[i][0] == S) sum += pow(2, i);
   }
   cout << sum << endl;
}

int main() {
   for (int i = 0; i <= 3; i++) {
      for (int j = 0; j <= 7; j++) {
         scanf("%1d", &map[i][j]);
      }
   }
   cin >> K;
   for (int k = 0; k < K; k++) {
      cin >> num >> dir;
      memset(is_rotate, 0, sizeof(is_rotate));
      memset(new_map, 0, sizeof(new_map));
      slove(num - 1, dir);
   }
   cal_rst();
}

히히 너무 무식하게 풀었오ㅠ

풀이 (dfs ver.)

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>

#define N 0
#define S 1
#define CW 1

using namespace std;

int K, num, dir;
int map[4][8];
int new_map[4][8];
int is_rotate[4];

void rotate(int num, int dir) {
    if (dir == CW) {
        for (int i = 0; i <= 7; i++) new_map[num][(i + 1) % 8] = map[num][i];
    } else {
        for (int i = 0; i <= 7; i++) new_map[num][(i + 7) % 8] = map[num][i];
    }
}

void update_map() {
    for (int i = 0; i <= 3; i++) {
        if (is_rotate[i]) {
            for (int j = 0; j <= 7; j++) map[i][j] = new_map[i][j];
        }
    }
}

void dfs(int num, int dir) {
    is_rotate[num] = 1;
    rotate(num, dir);
    if (!is_rotate[num - 1] && num - 1 >= 0) {
        if (map[num][6] != map[num - 1][2]) dfs(num - 1, dir * -1);
    }
    if (!is_rotate[num + 1] && num + 1 <= 3) {
        if (map[num][2] != map[num + 1][6]) dfs(num + 1, dir * -1);
    }
}

void cal_rst() {
    int sum = 0;
    for (int i = 0; i < 4; i++) {
        if (map[i][0] == S) sum += pow(2, i);
    }
    cout << sum << endl;
}

int main() {
    for (int i = 0; i <= 3; i++) {
        for (int j = 0; j <= 7; j++) {
            scanf("%1d", &map[i][j]);
        }
    }
    cin >> K;
    for (int k = 0; k < K; k++) {
        cin >> num >> dir;
        memset(is_rotate, 0, sizeof(is_rotate));
        memset(new_map, 0, sizeof(new_map));
        dfs(num - 1, dir);
        update_map();
    }
    cal_rst();
}

다시 풀이

profile
내가 보려고 만든 벨로그

0개의 댓글