Algorithm/구현(Brute force, Back tracking, etc.)
백준 14891 톱니바퀴
쩡류
2021. 11. 16. 20:42
728x90
- 무난한 구현문제이다. (백준 골드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;
}