15662번 - 톱니바퀴(2)
톱니바퀴 1과 똑같은 문제, 예전에 풀었던 문제 다시 풀어보는 느낌으로 풀어보았다.
비교해보니 마지막 정답을 구하는 부분과, N의 크기가 달라졌다.
재귀에서 일단 현재 톱니바퀴를 회전시킨다. (단, 회전시키기 전의 3시와 9시 값을 미리 저장한다.)
그 다음으로는 진행 방향의 톱니의 특정 위치의 값과 비교한다. 이때 합이 1이면 S극 과 N극으로 구성된 것이므로 회전시킨다.
<정답 코드>
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 | #include<iostream> #include<string> #include<deque> #define MAX 1001 using namespace std; int N, K; deque<int> dq[MAX]; void rotate(int cur, int dir, int chk) { int cur_right = dq[cur][2]; int cur_left = dq[cur][6]; if (dir == 1) { int tmp = dq[cur][7]; dq[cur].pop_back(); dq[cur].push_front(tmp); } else { int tmp = dq[cur][0]; dq[cur].pop_front(); dq[cur].push_back(tmp); } if ((chk == 1 || chk == 0)) { if (cur != N) { int right_left = dq[cur + 1][6]; if (cur_right + right_left == 1) { rotate(cur + 1, -dir, 1); } } } if ((chk == -1 || chk == 0)) { if (cur != 1) { int left_right = dq[cur - 1][2]; if (cur_left + left_right == 1) { rotate(cur - 1, -dir, -1); } } } } int main() { //freopen("input.txt", "r", stdin); cin >> N; for (int i = 1; i <= N; i++) { string tmp; cin >> tmp; for(int j=0;j<tmp.size();j++) dq[i].push_back(tmp[j]-'0'); } cin >> K; for (int i = 0; i < K; i++) { int start, dir; cin >> start >> dir; rotate(start, dir,0); } int ans = 0; for (int i = 1; i <= N; i++) if (dq[i][0] == 1) ans++; cout << ans << endl; return 0; } | cs |
반응형