14891번 - 톱니 바퀴
문제에서 구하란 대로 시뮬레이션을 통해서 풀었다.
톱니는 deque 를 이용해서 각 방향값들을 담았다. deque 를 쓴 이유는 톱니가 회전했을 경우, 톱니 값들을
앞으로 밀거나 뒤로 밀기에 편리하기 때문에 사용하였다.
rotate 함수를 통해서 w 위치에서 r 방향 움직이게 하였고, dir 을 통해서 처음에 0일때만 양방향으로
1이면 오른쪽으로만, 2이면 왼쪽으로만 재귀함수가 실행되도록 하기 위해서 추가하였다.
마지막 합을 구할 때 비트마스크 연산을 사용했는데, 아직 이 비트마스크가 헷갈려서 처음에 i<<1 로 계산해서 계속 틀렸다.
이 문제에서 얻어갈 점
rotate 하는거로 deque 로 구현한 점 ( 처음에 for문으로 구하려고 했는데.. 갑자기 어찌나 헷갈리던지..)
<정답 코드>
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<iostream> #include<deque> #include<vector> using namespace std; int k; vector<deque<int>> wheel(5,deque<int>(8) ); void rotate(int w, int r,int dir) { //시계 if (r == 1) { if (w + 1 <= 4 && (dir==0 || dir==1)) { if (wheel[w][2] != wheel[w + 1][6]) { rotate(w + 1, -r,1); } } if (w - 1 >= 1 && (dir==0 || dir==2)) { if (wheel[w][6] != wheel[w - 1][2]) { rotate(w - 1, -r, 2); } } int tmp = wheel[w].back(); wheel[w].pop_back(); wheel[w].push_front(tmp); } //반시계 if (r == -1) { if (w + 1 <= 4 && (dir == 0 || dir == 1)) { if (wheel[w][2] != wheel[w + 1][6]) { rotate(w + 1, -r, 1); } } if (w - 1 >= 1 && (dir == 0 || dir == 2)) { if (wheel[w][6] != wheel[w - 1][2]) { rotate(w - 1, -r, 2); } } int tmp = wheel[w].front(); wheel[w].pop_front(); wheel[w].push_back(tmp); } } int main() { //freopen("input.txt", "r", stdin); for (int i = 1; i <= 4; i++) { char tmp[9]; scanf("%s", &tmp); for (int j = 0; j < 8; j++) { wheel[i][j] = tmp[j] - '0'; } } int a[101][2]; scanf("%d", &k); for (int i = 0; i < k; i++) { scanf("%d %d", &a[i][0], &a[i][1]); } for(int i=0;i<k;i++) { rotate(a[i][0], a[i][1] ,0); } int sum = 0; for (int i = 1; i <= 4; i++) { if (wheel[i][0] == 0) { sum += 0; } else { sum += (1 << (i-1)); } } printf("%d\n", sum); return 0; } | cs |
반응형