[구현] 백준 14891 톱니바퀴
2021. 2. 17. 09:59ㆍ알고리즘 문제분석
수행기간 : 3시간
이 문제는 사실 풀었어도 올리지 않으려고 했다... 빡구현으로 푼 첫문제였고, 그 만큼 쓸때없는 코드들도 많고 그냥 노다가 한 느낌이 났기 때문에 ㅜㅜ 그래도 내가 원래 알고리즘을 잘 푸는 편도 아니였고, 차차 나아지면 되니까 나~~중에 실력이 늘었을 때, 그 때 지금의 코드를 보면 어떨까 싶어 올린다.
#include <iostream>
#include <math.h>
#include <vector>
#include <stdio.h>
using namespace std;
int a[8], b[8], c[8], d[8], k;
int num, dir;
void right_rotate(int arr[], int first, int end) { //시계 방향
int last = arr[end];
for (int i = end; i > first; i--) {
arr[i] = arr[i - 1];
}
arr[first] = last;
}
void left_rotate(int arr[], int first, int end) { //반시계방향
int front = arr[first];
for (int i = first; i < end; i++) {
arr[i] = arr[i + 1];
}
arr[end] = front;
}
int value() {
if (a[0] == 1 && b[0] == 1 && c[0] == 1 && d[0] == 1) {
return 15;
}
else if (a[0] == 1 && b[0] == 1 && c[0] == 1 && d[0] == 0) {
return 7;
}
else if (a[0] == 1 && b[0] == 1 && c[0] == 0 && d[0] == 1) {
return 11;
}
else if (a[0] == 1 && b[0] == 0 && c[0] == 1 && d[0] == 1) {
return 13;
}
else if (a[0] == 0 && b[0] == 1 && c[0] == 1 && d[0] == 1) {
return 14;
}
else if (a[0] == 0 && b[0] == 0 && c[0] == 1 && d[0] == 1) {
return 12;
}
else if (a[0] == 0 && b[0] == 1 && c[0] == 0 && d[0] == 1) {
return 10;
}
else if (a[0] == 1 && b[0] == 0 && c[0] == 0 && d[0] == 1) {
return 9;
}
else if (a[0] == 1 && b[0] == 1 && c[0] == 0 && d[0] == 0) {
return 3;
}
else if (a[0] == 1 && b[0] == 0 && c[0] == 1 && d[0] == 0) {
return 5;
}
else if (a[0] == 0 && b[0] == 1 && c[0] == 1 && d[0] == 0) {
return 6;
}
else if (a[0] == 0 && b[0] == 0 && c[0] == 0 && d[0] == 1) {
return 8;
}
else if (a[0] == 0 && b[0] == 0 && c[0] == 1 && d[0] == 0) {
return 4;
}
else if (a[0] == 0 && b[0] == 1 && c[0] == 0 && d[0] == 0) {
return 2;
}
else if (a[0] == 1 && b[0] == 0 && c[0] == 0 && d[0] == 0) {
return 1;
}
else if (a[0] == 0 && b[0] == 0 && c[0] == 0 && d[0] == 0) {
return 0;
}
}
void calculate(int x, int y) {
if (x == 1) {
if (y == 1) {
if (a[2] == b[6]) {
right_rotate(a, 0, 7);
}
else if (a[2] != b[6]) {
if (b[2] == c[6]) {
right_rotate(a, 0, 7);
left_rotate(b, 0, 7);
}
else if (b[2] != c[6]) {
if (c[2] == d[6]) {
right_rotate(a, 0, 7);
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
right_rotate(a, 0, 7);
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
}
}
}
else if (y == 2) {
if (b[6] == a[2] && b[2] == c[6]) {
right_rotate(b, 0, 7);
}
else if (b[6] != a[2] && b[2] == c[6]) {
right_rotate(b, 0, 7);
left_rotate(a, 0, 7);
}
else if (b[6] == a[2] && b[2] != c[6]) {
if (c[2] == d[6]) {
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
right_rotate(d, 0, 7);
}
}
else if (b[6] != a[2] && b[2] != c[6]) {
if (c[2] == d[6]) {
left_rotate(a, 0, 7);
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
left_rotate(a, 0, 7);
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
right_rotate(d, 0, 7);
}
}
}
else if (y == 3) {
if (d[6] == c[2] && c[2] == b[6]) {
right_rotate(c, 0, 7);
}
else if (d[6] != c[2] && c[2] == b[6]) {
right_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
else if (d[6] == c[2] && b[2] != c[6]) {
if (a[2] == b[6]) {
right_rotate(c, 0, 7);
left_rotate(b, 0, 7);
}
else if (b[2] != a[6]) {
right_rotate(c, 0, 7);
left_rotate(b, 0, 7);
right_rotate(a, 0, 7);
}
}
else if (d[6] != c[2] && b[2] != c[6]) {
if (a[2] == b[6]) {
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
else if (a[2] != b[6]) {
left_rotate(d, 0, 7);
right_rotate(c, 0, 7);
left_rotate(b, 0, 7);
right_rotate(a, 0, 7);
}
}
}
else if (y == 4) {
if (d[6] == c[2]) {
right_rotate(d, 0, 7);
}
else if (d[6] != c[2]) {
if (c[6] == b[2]) {
right_rotate(d, 0, 7);
left_rotate(c, 0, 7);
}
else if (c[6] != b[2]) {
if (b[6] == a[2]) {
right_rotate(d, 0, 7);
left_rotate(c, 0, 7);
right_rotate(b, 0, 7);
}
else if (b[6] != a[2]) {
right_rotate(d, 0, 7);
left_rotate(c, 0, 7);
right_rotate(b, 0, 7);
left_rotate(a, 0, 7);
}
}
}
}
}
else if (x == -1) {
if (y == 1) {
if (a[2] == b[6]) {
left_rotate(a, 0, 7);
}
else if (a[2] != b[6]) {
if (b[2] == c[6]) {
left_rotate(a, 0, 7);
right_rotate(b, 0, 7);
}
else if (b[2] != c[6]) {
if (c[2] == d[6]) {
left_rotate(a, 0, 7);
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
left_rotate(a, 0, 7);
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
}
}
}
else if (y == 2) {
if (b[6] == a[2] && b[2] == c[6]) {
left_rotate(b, 0, 7);
}
else if (b[6] != a[2] && b[2] == c[6]) {
left_rotate(b, 0, 7);
right_rotate(a, 0, 7);
}
else if (b[6] == a[2] && b[2] != c[6]) {
if (c[2] == d[6]) {
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
}
else if (b[6] != a[2] && b[2] != c[6]) {
if (c[2] == d[6]) {
right_rotate(a, 0, 7);
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
}
else if (c[2] != d[6]) {
right_rotate(a, 0, 7);
left_rotate(b, 0, 7);
right_rotate(c, 0, 7);
left_rotate(d, 0, 7);
}
}
}
else if (y == 3) {
if (d[6] == c[2] && c[2] == b[6]) {
left_rotate(c, 0, 7);
}
else if (d[6] != c[2] && c[2] == b[6]) {
left_rotate(c, 0, 7);
right_rotate(d, 0, 7);
}
else if (d[6] == c[2] && b[2] != c[6]) {
if (a[2] == b[6]) {
left_rotate(c, 0, 7);
right_rotate(b, 0, 7);
}
else if (b[2] != a[6]) {
left_rotate(c, 0, 7);
right_rotate(b, 0, 7);
left_rotate(a, 0, 7);
}
}
else if (d[6] != c[2] && b[2] != c[6]) {
if (a[2] == b[6]) {
right_rotate(b, 0, 7);
left_rotate(c, 0, 7);
right_rotate(d, 0, 7);
}
else if (a[2] != b[6]) {
right_rotate(d, 0, 7);
left_rotate(c, 0, 7);
right_rotate(b, 0, 7);
left_rotate(a, 0, 7);
}
}
}
else if (y == 4) {
if (d[6] == c[2]) {
left_rotate(d, 0, 7);
}
else if (d[6] != c[2]) {
if (c[6] == b[2]) {
left_rotate(d, 0, 7);
right_rotate(c, 0, 7);
}
else if (c[6] != b[2]) {
if (b[6] == a[2]) {
left_rotate(d, 0, 7);
right_rotate(c, 0, 7);
left_rotate(b, 0, 7);
}
else if (b[6] != a[2]) {
left_rotate(d, 0, 7);
right_rotate(c, 0, 7);
left_rotate(b, 0, 7);
right_rotate(a, 0, 7);
}
}
}
}
}
}
int main() {
for (int i = 0;i < 8;i++) {
scanf_s("%1d", &a[i]);
}
for (int i = 0;i < 8;i++) {
scanf_s("%1d", &b[i]);
}
for (int i = 0;i < 8;i++) {
scanf_s("%1d", &c[i]);
}
for (int i = 0;i < 8;i++) {
scanf_s("%1d", &d[i]);
}
cin >> k;
for (int i = 0;i < k;i++) {
cin >> num >> dir;
calculate(dir, num);
}
cout << value();
}
'알고리즘 문제분석' 카테고리의 다른 글
[완전탐색] 백준 3085번 사탕 게임 (0) | 2021.02.22 |
---|---|
[DFS] 백준 1325 효율적인 해킹 (0) | 2021.02.18 |
[C++] vector/queue 새롭게 알게된 내용 정리 (0) | 2021.02.15 |
[BFS&구현] 백준 16234 인구 이동 (0) | 2021.02.15 |
[BFS] 백준 7576 토마토 (0) | 2021.02.01 |