BOJ::14891 톱니바퀴
https://www.acmicpc.net/problem/14891
이문제는 어렵다기보단 까다롭다 라는 표현이 맞을거 같다.
머리에서 직관적으로 떠오르지 않고, 회전 결과에 대해 상상이 잘 안되서 그리면서 풀었다.
또한 최대한 편하고 직관적으로 코드가 눈에 들어올 수 있도록 함수를 이용하여 풀었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <stdio.h> #include <memory.h> bool check[4]; int map[4][8]; int k; //시계방향 회전 void cw(int *array) { int tmp = array[7]; for (int i = 7; i > 0; i--) { array[i] = array[i - 1]; } array[0] = tmp; } //반시계방향 회전 void ccw(int *array) { int tmp = array[0]; for (int i = 0; i < 7; i++) { array[i] = array[i + 1]; } array[7] = tmp; } void swit(int *array,int flag) { if (flag == 1) { cw(array); } else { ccw(array); } } void solve(int n, int flag) { check[n] = true; if (n + 1 < 4 && !check[n+1]) { if (map[n][2] != map[n + 1][6]) { solve(n + 1, -1 * flag); } } if (n - 1 >= 0 && !check[n-1]) { if (map[n][6] != map[n - 1][2]) { solve(n - 1, -1 * flag); } } swit(map[n], flag); } int main() { char input[9]; for (int i = 0; i < 4; i++) { scanf("%s", &input); for (int j = 0; j < 8; j++) { map[i][j] = input[j]-'0'; } } scanf("%d", &k); for (int i = 0; i < k; i++) { int x, y; scanf("%d %d", &x, &y); memset(check, 0, sizeof(check)); solve(x-1, y); } int score = 1; int res = 0; for (int i = 0; i < 4; i++) { if (map[i][0] == 1) res += score; score *= 2; } printf("%d\n", res); } | cs |