-
백준 14891 톱니바퀴Algorithm/구현(Brute force, Back tracking, etc.) 2021. 11. 16. 20:42728x90
- 무난한 구현문제이다. (백준 골드5)
- 8개의 톱니 * 4개의 톱니바퀴 * 최대 100의 회전 수를 해서 시간복잡도는 신경쓰지 않아도 된다.
- 한 번의 회전이 일어날 때 마다, 각 톱니바퀴들이 어느 방향으로 회전 할 지를 조사하여 일괄적으로 변화시키도록 구현한다.
- 처음 톱니의 상태를 입력을 받을 때, string 타입의 vector로 받는다. 그 후, 회전시킬 톱니바퀴와 방향을 입력받는다. 톱니바퀴를 기준으로 왼쪽에(혹은 오른쪽에) 있는 톱니들로 이동하면서 회전 여부 및 어느 방향으로 회전을 할 지를 vector d에 담아서 처리한다.
#include <iostream> #include <vector> #include <string> using namespace std; int main() { int n = 4; vector<string> a(n); // 8방향의 톱니바퀴를 다 구해주고 for (int i = 0; i<n; i++) { cin >> a[i]; } int k; cin >> k; while (k--) { int no, dir; // 회전시킬 톱니바퀴 및 방향 cin >> no >> dir; no -= 1; // index에 맞추기 위해. 1번째 톱니바퀴의 index는 0이 된다. // 각각의 톱니는 동시에 회전해야 하기 때문에 // 먼저, 각 톱니가 어떤 방향으로 회전해야 하는지 구하자 vector<int> d(n); // 어떤 방향으로 회전 할 지가 담기는 벡터 d[no] = dir; // 왼쪽 톱니를 연쇄적으로 구하고 for (int i = no - 1; i >= 0; i--) { if (a[i][2] != a[i + 1][6]) { d[i] = -d[i + 1]; } else { // 한 톱니가 회전하지 않으면 // 그 톱니의 왼쪽에 있는 톱니도 회전하지 않는다. break; } } // 오른쪽 톱니를 연쇄적으로 구하고 for (int i = no + 1; i<n; i++) { if (a[i - 1][2] != a[i][6]) { d[i] = -d[i - 1]; } else { // 한 톱니가 회전하지 않으면 // 그 톱니의 오른쪽에 있는 톱니도 회전하지 않는다. break; } } for (int i = 0; i<n; i++) { if (d[i] == 0) continue; if (d[i] == 1) { // 시계 방향 회전 char temp = a[i][7]; for (int j = 7; j >= 1; j--) { a[i][j] = a[i][j - 1]; } a[i][0] = temp; } else if (d[i] == -1) { // 반시계 방향 회전 char temp = a[i][0]; for (int j = 0; j<7; j++) { a[i][j] = a[i][j + 1]; } a[i][7] = temp; } } } int ans = 0; for (int i = 0; i<n; i++) { if (a[i][0] == '1') { ans |= (1 << i); } } cout << ans<< '\n'; return 0; }
'Algorithm > 구현(Brute force, Back tracking, etc.)' 카테고리의 다른 글
백준 15694 사다리 조작 (0) 2021.11.17 백준 15683 감시 (0) 2021.11.17 백준 14890 경사로 (0) 2021.11.16 백준 14889 스타트와 링크 (0) 2021.11.15 백준 14888 연산자 끼워넣기 (0) 2021.11.15