-
백준 - 톱니바퀴 (14891) [C++]문제 풀이/백준 2023. 3. 26. 19:13반응형
이 문제는 시뮬레이션 문제로 주어진 요구사항을 그대로 구현하면 시간 초과 없이 해결할 수 있는 문제이다. 톱니바퀴를 돌리는 구현에 있어서 덱을 사용하여 문제를 해결했다.
#include <iostream> #include <deque> #include <string> #include <cmath> using namespace std; deque<int> gear[4]; #define CLOCK 1 #define COUNTERCLOCK -1 #define N 0 #define S 1 int leftSide(int gearNum) { int temp1 = gear[gearNum].back(); gear[gearNum].pop_back(); int temp2 = gear[gearNum].back(); gear[gearNum].push_back(temp1); return temp2; } int rightSide(int gearNum) { int temp1 = gear[gearNum].front(); gear[gearNum].pop_front(); int temp2 = gear[gearNum].front(); gear[gearNum].pop_front(); int temp3 = gear[gearNum].front(); gear[gearNum].push_front(temp2); gear[gearNum].push_front(temp1); return temp3; } void clockRoll(int gearNum) { int temp = gear[gearNum].back(); gear[gearNum].pop_back(); gear[gearNum].push_front(temp); } void counterRoll(int gearNum) { int temp = gear[gearNum].front(); gear[gearNum].pop_front(); gear[gearNum].push_back(temp); } void clock(int); void counterClock(int); void clock(int gearNum) { int rotation[4] = { 0, 0, 0, 0 }; rotation[gearNum] = CLOCK; // left for (int i = gearNum - 1; i >= 0; i--) { int prev = i + 1; if (rightSide(i) != leftSide(prev)) { if (rotation[prev] == CLOCK) { rotation[i] = COUNTERCLOCK; } else if (rotation[prev] == COUNTERCLOCK) { rotation[i] = CLOCK; } } } // right for (int i = gearNum + 1; i < 4; i++) { int prev = i - 1; if (rightSide(prev) != leftSide(i)) { if (rotation[prev] == CLOCK) { rotation[i] = COUNTERCLOCK; } else if (rotation[prev] == COUNTERCLOCK) { rotation[i] = CLOCK; } } } for (int i = 0; i < 4; i++) { if (rotation[i] == COUNTERCLOCK) { counterRoll(i); } else if (rotation[i] == CLOCK) { clockRoll(i); } } } void counterClock(int gearNum) { int rotation[4] = { 0, 0, 0, 0 }; rotation[gearNum] = COUNTERCLOCK; // left for (int i = gearNum - 1; i >= 0; i--) { int prev = i + 1; if (rightSide(i) != leftSide(prev)) { if (rotation[prev] == CLOCK) { rotation[i] = COUNTERCLOCK; } else if (rotation[prev] == COUNTERCLOCK) { rotation[i] = CLOCK; } } } // right for (int i = gearNum + 1; i < 4; i++) { int prev = i - 1; if (rightSide(prev) != leftSide(i)) { if (rotation[prev] == CLOCK) { rotation[i] = COUNTERCLOCK; } else if (rotation[prev] == COUNTERCLOCK) { rotation[i] = CLOCK; } } } for (int i = 0; i < 4; i++) { if (rotation[i] == COUNTERCLOCK) { counterRoll(i); } else if (rotation[i] == CLOCK) { clockRoll(i); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); char temp; int k; for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { cin >> temp; gear[i].push_back(temp - '0'); } } cin >> k; for (int i = 0; i < k; i++) { int a, b; cin >> a >> b; if (b == CLOCK) { clock(a - 1); } else if (b == COUNTERCLOCK) { counterClock(a - 1); } } int result = 0; for (int i = 0; i <= 3; i++) { if (gear[i].front() == S) { result += pow(2, i); } } cout << result << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 게리맨더링 2 (17779) [C++] (0) 2023.03.27 백준 - 낚시왕 (17143) [C++] (0) 2023.03.26 백준 - 2048 (Easy) (12100) [C++] (2) 2023.03.25 백준 - 뱀 (3190) [C++] (0) 2023.03.25 백준 - 미세먼지 안녕! (17144) [C++] (0) 2023.03.25