문제
오늘은 2×2×2 루빅스 큐브를 풀어보려고 한다. 큐브의 각 면은 양방향으로 90도 돌릴 수 있게 만들어져 있다. 큐브의 각 면에 있는 색상이 모두 같으면 큐브를 풀었다고 한다.
2×2×2 루빅스 큐브가 주어졌을 때, 정확히 한 번 돌려서 큐브를 풀 수 있는지 아닌지 구해보자.
입력
첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.
출력
루빅스 큐브를 정확히 한 번 돌려서 풀 수 있으면 1, 없으면 0을 출력한다.
예제 입력 1
2 5 4 6 1 3 6 2 5 5 1 2 3 5 3 1 1 2 4 6 6 4 3 4
예제 출력 1
0
예제 입력 2
5 3 5 3 2 5 2 5 6 2 6 2 4 4 4 4 1 1 1 1 6 3 6 3
예제 출력 2
1
알고리즘 분류
- 구현
풀이
1. 왼쪽 면 뒤로 돌리기
2. 오른쪽 면 뒤로 돌리기
3. 왼쪽 면 앞으로 돌리기
4. 오른쪽 면 앞으로 돌리기
5. 앞쪽 면 오른쪽으로 돌리기
6. 뒤쪽 면 오른쪽으로 돌리기
7. 앞쪽 면 왼쪽으로 돌리기
8. 뒤쪽 면 왼쪽으로 돌리기
9. 위쪽 면 시계 방향으로 돌리기
10. 아래쪽 면 시계 방향으로 돌리기
11. 위쪽 면 반시계 방향으로 돌리기
12. 아래쪽 면 반시계 방향으로 돌리기
를 각각 구현해주면 된다. 단 한 번만 90도로 돌렸을 때 큐브를 풀었는 지 안 풀었는지를 따지므로, 그렇게 어렵진 않다.
더 좋은 방법이 있겠지만 본인은 다른 방법이 생각이 안 나서 무지성으로 풀었다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <set>
#include <unordered_map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define FIRST cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 25
#define LL long long
#define INF 1e9
using namespace std;
int MAP[MAX];
int Another_MAP[MAX];
bool Flag = false;
bool Check_Cube() {
if ((MAP[1] != MAP[2]) || (MAP[1] != MAP[3]) || (MAP[1] != MAP[4])) {
return false;
}
if ((MAP[5] != MAP[6]) || (MAP[5] != MAP[7]) || (MAP[5] != MAP[8])) {
return false;
}
if ((MAP[9] != MAP[10]) || (MAP[9] != MAP[11]) || (MAP[9] != MAP[12])) {
return false;
}
if ((MAP[13] != MAP[14]) || (MAP[13] != MAP[15]) || (MAP[13] != MAP[16])) {
return false;
}
if ((MAP[17] != MAP[18]) || (MAP[17] != MAP[19]) || (MAP[17] != MAP[20])) {
return false;
}
if ((MAP[21] != MAP[22]) || (MAP[21] != MAP[23]) || (MAP[21] != MAP[24])) {
return false;
}
return true;
}
void Copy_MAP() {
for (int i = 1; i <= 24; i++) {
MAP[i] = Another_MAP[i];
}
}
void First_Rotation() { // (3, 1), (22, 24), (11, 9), (7, 5), 왼쪽 면 뒤로 돌리기
int tmp1 = MAP[1];
int tmp2 = MAP[3];
MAP[1] = MAP[5];
MAP[3] = MAP[7];
MAP[5] = MAP[9];
MAP[7] = MAP[11];
MAP[9] = MAP[24];
MAP[11] = MAP[22];
MAP[24] = tmp1;
MAP[22] = tmp2;
int tmp = MAP[14];
MAP[14] = MAP[16];
MAP[16] = MAP[15];
MAP[15] = MAP[13];
MAP[13] = tmp;
}
void Second_Rotation() { // (4, 2), (21, 23), (12, 10), (8, 6), 오른쪽 면 뒤로 돌리기
int tmp1 = MAP[2];
int tmp2 = MAP[4];
MAP[2] = MAP[6];
MAP[4] = MAP[8];
MAP[6] = MAP[10];
MAP[8] = MAP[12];
MAP[10] = MAP[23];
MAP[12] = MAP[21];
MAP[23] = tmp1;
MAP[21] = tmp2;
int tmp = MAP[17];
MAP[17] = MAP[19];
MAP[19] = MAP[20];
MAP[20] = MAP[18];
MAP[18] = tmp;
}
void Third_Rotation() { // (1, 3), (24, 22), (9, 11), (5, 7), 왼쪽 면 앞으로 돌리기
int tmp1 = MAP[3];
int tmp2 = MAP[1];
MAP[3] = MAP[22];
MAP[1] = MAP[24];
MAP[22] = MAP[11];
MAP[24] = MAP[9];
MAP[11] = MAP[7];
MAP[9] = MAP[5];
MAP[7] = tmp1;
MAP[5] = tmp2;
int tmp = MAP[14];
MAP[14] = MAP[13];
MAP[13] = MAP[15];
MAP[15] = MAP[16];
MAP[16] = tmp;
}
void Fourth_Rotation() { // (2, 4), (23, 21), (10, 12), (6, 8), 오른쪽 면 앞으로 돌리기
int tmp1 = MAP[4];
int tmp2 = MAP[2];
MAP[4] = MAP[21];
MAP[2] = MAP[23];
MAP[21] = MAP[12];
MAP[23] = MAP[10];
MAP[12] = MAP[8];
MAP[10] = MAP[6];
MAP[8] = tmp1;
MAP[6] = tmp2;
int tmp = MAP[17];
MAP[17] = MAP[18];
MAP[18] = MAP[20];
MAP[20] = MAP[19];
MAP[19] = tmp;
}
void Fifth_Rotation() { // (3, 4), (17, 19), (10, 9), (16, 14), 앞쪽 면 오른쪽으로 돌리기
int tmp1 = MAP[3];
int tmp2 = MAP[4];
MAP[3] = MAP[17];
MAP[4] = MAP[19];
MAP[17] = MAP[10];
MAP[19] = MAP[9];
MAP[10] = MAP[16];
MAP[9] = MAP[14];
MAP[16] = tmp1;
MAP[14] = tmp2;
int tmp = MAP[5];
MAP[5] = MAP[7];
MAP[7] = MAP[8];
MAP[8] = MAP[6];
MAP[6] = tmp;
}
void Sixth_Rotation() { // (1, 2), (18, 20), (12, 11), (15, 13), 뒤쪽 면 오른쪽으로 돌리기
int tmp1 = MAP[1];
int tmp2 = MAP[2];
MAP[1] = MAP[18];
MAP[2] = MAP[20];
MAP[18] = MAP[12];
MAP[20] = MAP[11];
MAP[12] = MAP[15];
MAP[11] = MAP[13];
MAP[15] = tmp1;
MAP[13] = tmp2;
int tmp = MAP[22];
MAP[22] = MAP[24];
MAP[24] = MAP[23];
MAP[23] = MAP[21];
MAP[21] = tmp;
}
void Seventh_Rotation() { // (4, 3), (19, 17), (9, 10), (14, 16), 앞쪽 면 왼쪽으로 돌리기
int tmp1 = MAP[4];
int tmp2 = MAP[3];
MAP[4] = MAP[14];
MAP[3] = MAP[16];
MAP[14] = MAP[9];
MAP[16] = MAP[10];
MAP[9] = MAP[19];
MAP[10] = MAP[17];
MAP[19] = tmp1;
MAP[17] = tmp2;
int tmp = MAP[5];
MAP[5] = MAP[6];
MAP[6] = MAP[8];
MAP[8] = MAP[7];
MAP[7] = tmp;
}
void Eighth_Rotation() { // (2, 1), (20, 18), (11, 12), (13, 15), 뒤쪽 면 왼쪽으로 돌리기
int tmp1 = MAP[2];
int tmp2 = MAP[1];
MAP[1] = MAP[13];
MAP[2] = MAP[15];
MAP[13] = MAP[11];
MAP[15] = MAP[12];
MAP[11] = MAP[20];
MAP[12] = MAP[18];
MAP[20] = tmp1;
MAP[18] = tmp2;
int tmp = MAP[22];
MAP[22] = MAP[21];
MAP[21] = MAP[23];
MAP[23] = MAP[24];
MAP[24] = tmp;
}
void Ninth_Rotation() { // (5, 6), (17, 18), (21, 22), (13, 14), 위쪽 면 시계 방향으로 돌리기
int tmp1 = MAP[5];
int tmp2 = MAP[6];
MAP[5] = MAP[13];
MAP[6] = MAP[14];
MAP[13] = MAP[21];
MAP[14] = MAP[22];
MAP[21] = MAP[17];
MAP[22] = MAP[18];
MAP[17] = tmp1;
MAP[18] = tmp2;
int tmp = MAP[3];
MAP[3] = MAP[1];
MAP[1] = MAP[2];
MAP[2] = MAP[4];
MAP[4] = tmp;
}
void Tenth_Rotation() { // (7, 8), (19, 20), (23, 24), (15, 16), 아래쪽 면 시계 방향으로 돌리기
int tmp1 = MAP[7];
int tmp2 = MAP[8];
MAP[7] = MAP[15];
MAP[8] = MAP[16];
MAP[15] = MAP[23];
MAP[16] = MAP[24];
MAP[23] = MAP[19];
MAP[24] = MAP[20];
MAP[19] = tmp1;
MAP[20] = tmp2;
int tmp = MAP[9];
MAP[9] = MAP[11];
MAP[11] = MAP[12];
MAP[12] = MAP[10];
MAP[10] = tmp;
}
void Eleventh_Rotation() { // (6, 5), (18, 17), (22, 21), (14, 13), 위쪽 면 반시계 방향으로 돌리기
int tmp1 = MAP[6];
int tmp2 = MAP[5];
MAP[6] = MAP[18];
MAP[5] = MAP[17];
MAP[18] = MAP[22];
MAP[17] = MAP[21];
MAP[22] = MAP[14];
MAP[21] = MAP[13];
MAP[14] = tmp1;
MAP[13] = tmp2;
int tmp = MAP[3];
MAP[3] = MAP[4];
MAP[4] = MAP[2];
MAP[2] = MAP[1];
MAP[1] = tmp;
}
void Twelfth_Rotation() { // (8, 7), (20, 19), (24, 23), (16, 15), 아래쪽 면 반시계 방향으로 돌리기
int tmp1 = MAP[8];
int tmp2 = MAP[7];
MAP[8] = MAP[20];
MAP[7] = MAP[19];
MAP[20] = MAP[23];
MAP[19] = MAP[24];
MAP[23] = MAP[19];
MAP[24] = MAP[20];
MAP[19] = tmp1;
MAP[20] = tmp2;
int tmp = MAP[9];
MAP[9] = MAP[10];
MAP[10] = MAP[12];
MAP[12] = MAP[11];
MAP[11] = tmp;
}
int main() {
FIRST
for (int i = 1; i <= 24; i++) {
cin >> MAP[i];
}
for (int i = 1; i <= 24; i++) {
Another_MAP[i] = MAP[i];
}
Copy_MAP();
First_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Second_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Third_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Fourth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Fifth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Sixth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Seventh_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Eighth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Ninth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Tenth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Eleventh_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
Copy_MAP();
Twelfth_Rotation();
if (Check_Cube()) {
Flag = true;
cout << Flag << "\n";
return 0;
}
cout << Flag << "\n";
return 0;
}
'BOJ > Gold' 카테고리의 다른 글
[BOJ/Gold 2] 백준 17837 새로운 게임 2(C++) (0) | 2022.01.18 |
---|---|
[BOJ/Gold 2] 백준 17780 새로운 게임(C++) (0) | 2022.01.18 |
[BOJ/Gold 2] 백준 17143 낚시왕(C++) (0) | 2022.01.17 |
[BOJ/Gold 2] 백준 5577 RBY팡!(C++) (0) | 2022.01.17 |
[BOJ/Gold 2] 백준 3101 토끼의 이동(C++) (0) | 2022.01.17 |