Study hard
(c++)백준 16939번: 2x2x2큐브 본문
16939번: 2×2×2 큐브
첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.
www.acmicpc.net
[풀이]
큐브를 아래 그림과 같이 두고 풀었다.
위와 같이 두고 입력을 받으면 뒷면->윗면->앞면->왼면->오른면->아랫면 순서로 입력을 받게 된다.
각 면을 시계방향으로 돌리는 경우와 반시계방향으로 돌리는 경우를 모두 확인하도록 해야한다.
※각면을 윗면로 두었을 때 사방에 어떤 면의 몇번째 칸이 붙게 되는지 그려보면서 풀어서 그나마 덜 헷갈리고 풀 수 있었다..
처음엔 각 면마다 2*2배열을 선언해주었는데 복사하는 배열까지 전역변수가 너무 많아졌다. 다른 분들 풀이를 참고해서 Cube[7]벡터를 사용하기로 했다.
#include <iostream>
#include <vector>
using namespace std;
#define Back 1
#define Up 2
#define Front 3
#define Left 4
#define Right 5
#define Down 6
vector<int>Cube[7], Cube2[7];
void input() {
for (int i = 1; i <= 6; i++) {
for (int j = 0; j < 4; j++) {
int c;
cin >> c;
Cube[i].push_back(c);
}
}
}
bool Turn(int n, int dir) {
for (int i = 1; i < 7; i++)
Cube2[i] = Cube[i];
//윗면
if (n == Up) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Back][2];
int tmp2 = Cube2[Back][3];
//왼면 -> 뒷면
Cube2[Back][2] = Cube2[Left][3];
Cube2[Back][3] = Cube2[Left][1];
//앞면 -> 왼면
Cube2[Left][1] = Cube2[Front][0];
Cube2[Left][3] = Cube2[Front][1];
//오른면 -> 앞면
Cube2[Front][0] = Cube2[Right][2];
Cube2[Front][1] = Cube2[Right][0];
//뒷면 ->오른면
Cube2[Right][2] = tmp2;
Cube2[Right][0] = tmp1;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Back][2];
int tmp2 = Cube2[Back][3];
//오른면 -> 뒷면
Cube2[Back][2] = Cube2[Right][0];
Cube2[Back][3] = Cube2[Right][2];
//앞면 -> 오른면
Cube2[Right][0] = Cube2[Front][1];
Cube2[Right][2] = Cube2[Front][0];
//왼면 -> 앞면
Cube2[Front][0] = Cube2[Left][1];
Cube2[Front][1] = Cube2[Left][3];
//뒷면 -> 왼면
Cube2[Left][1] = tmp2;
Cube2[Left][3] = tmp1;
}
}
//아랫면
else if (n == Down) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Back][1];
int tmp2 = Cube2[Back][0];
//오른면 -> 뒷면
Cube2[Back][0] = Cube2[Right][1];
Cube2[Back][1] = Cube2[Right][3];
//앞면 -> 오른면
Cube2[Right][1] = Cube2[Front][3];
Cube2[Right][3] = Cube2[Front][2];
//왼면 -> 앞면
Cube2[Front][3] = Cube2[Left][2];
Cube2[Front][2] = Cube2[Left][0];
//뒷면 ->왼면
Cube2[Left][2] = tmp2;
Cube2[Left][0] = tmp1;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Back][1];
int tmp2 = Cube2[Back][0];
//왼면 -> 뒷면
Cube2[Back][0] = Cube2[Left][2];
Cube2[Back][1] = Cube2[Left][0];
//앞면 -> 왼면
Cube2[Left][2] = Cube2[Front][3];
Cube2[Left][0] = Cube2[Front][2];
//오른면 -> 앞면
Cube2[Front][3] = Cube2[Right][1];
Cube2[Front][2] = Cube2[Right][3];
//뒷면 ->오른면
Cube2[Right][1] = tmp2;
Cube2[Right][3] = tmp1;
}
}
//뒷면
else if (n == Back) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Down][1];
int tmp2 = Cube2[Down][0];
//왼면 -> 아랫면
Cube2[Down][0] = Cube2[Left][0];
Cube2[Down][1] = Cube2[Left][1];
//앞면 -> 왼면
Cube2[Left][0] = Cube2[Up][0];
Cube2[Left][1] = Cube2[Up][1];
//오른면 -> 앞면
Cube2[Up][0] = Cube2[Right][0];
Cube2[Up][1] = Cube2[Right][1];
//아랫면 -> 오른면
Cube2[Right][0] = tmp2;
Cube2[Right][1] = tmp1;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Down][1];
int tmp2 = Cube2[Down][0];
//오른면 -> 아랫면
Cube2[Down][0] = Cube2[Right][0];
Cube2[Down][1] = Cube2[Right][1];
//앞면 -> 오른면
Cube2[Right][0] = Cube2[Up][0];
Cube2[Right][1] = Cube2[Up][1];
//왼면 -> 앞면
Cube2[Up][0] = Cube2[Left][0];
Cube2[Up][1] = Cube2[Left][1];
//아랫면 -> 왼면
Cube2[Left][0] = tmp2;
Cube2[Left][1] = tmp1;
}
}
//앞면
else if (n == Front) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Up][2];
int tmp2 = Cube2[Up][3];
//왼면 -> 윗면
Cube2[Up][3] = Cube2[Left][3];
Cube2[Up][2] = Cube2[Left][2];
//아랫면 -> 왼면
Cube2[Left][3] = Cube2[Down][3];
Cube2[Left][2] = Cube2[Down][2];
//오른면 -> 아랫면
Cube2[Down][3] = Cube2[Right][3];
Cube2[Down][2] = Cube2[Right][2];
//윗면 -> 오른면
Cube2[Right][3] = tmp2;
Cube2[Right][2] = tmp1;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Up][2];
int tmp2 = Cube2[Up][3];
//오른면 -> 윗면
Cube2[Up][3] = Cube2[Right][3];
Cube2[Up][2] = Cube2[Right][2];
//아랫면 -> 오른면
Cube2[Right][3] = Cube2[Down][3];
Cube2[Right][2] = Cube2[Down][2];
//왼면 -> 아랫면
Cube2[Down][3] = Cube2[Left][3];
Cube2[Down][2] = Cube2[Left][2];
//윗면 -> 왼면
Cube2[Left][3] = tmp2;
Cube2[Left][2] = tmp1;
}
}
//왼면
else if (n == Left) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Back][0];
int tmp2 = Cube2[Back][2];
//아랫면 -> 뒷면
Cube2[Back][0] = Cube2[Down][3];
Cube2[Back][2] = Cube2[Down][1];
//앞면 -> 아랫면
Cube2[Down][1] = Cube2[Front][2];
Cube2[Down][3] = Cube2[Front][0];
//윗면 -> 앞면
Cube2[Front][2] = Cube2[Up][2];
Cube2[Front][0] = Cube2[Up][0];
//뒷면 -> 윗면
Cube2[Up][0] = tmp1;
Cube2[Up][2] = tmp2;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Back][0];
int tmp2 = Cube2[Back][2];
//윗면 -> 뒷면
Cube2[Back][0] = Cube2[Up][0];
Cube2[Back][2] = Cube2[Up][2];
//앞면 -> 윗면
Cube2[Up][2] = Cube2[Front][2];
Cube2[Up][0] = Cube2[Front][0];
//아랫면 -> 앞면
Cube2[Front][2] = Cube2[Down][1];
Cube2[Front][0] = Cube2[Down][3];
//뒷면 -> 아랫면
Cube2[Down][3] = tmp1;
Cube2[Down][1] = tmp2;
}
}
//오른면
else if (n == Right) {
//시계방향으로 돌리기
if (dir == 0) {
int tmp1 = Cube2[Back][3];
int tmp2 = Cube2[Back][1];
//윗면 -> 뒷면
Cube2[Back][1] = Cube2[Up][1];
Cube2[Back][3] = Cube2[Up][3];
//앞면 -> 윗면
Cube2[Up][1] = Cube2[Front][1];
Cube2[Up][3] = Cube2[Front][3];
//아랫면 -> 앞면
Cube2[Front][1] = Cube2[Down][2];
Cube2[Front][3] = Cube2[Down][0];
//뒷면 -> 아랫면
Cube2[Down][0] = tmp1;
Cube2[Down][2] = tmp2;
}
//반시계방향으로 돌리기
else {
int tmp1 = Cube2[Back][3];
int tmp2 = Cube2[Back][1];
//아랫면 -> 뒷면
Cube2[Back][1] = Cube2[Down][2];
Cube2[Back][3] = Cube2[Down][0];
//앞면 -> 아랫면
Cube2[Down][2] = Cube2[Front][1];
Cube2[Down][0] = Cube2[Front][3];
//윗면 -> 앞면
Cube2[Front][1] = Cube2[Up][1];
Cube2[Front][3] = Cube2[Up][3];
//뒷면 -> 윗면
Cube2[Up][3] = tmp1;
Cube2[Up][1] = tmp2;
}
}
for (int i = 1; i < 7; i++) {
int color = Cube2[i][0];
for (int j = 0; j < 4; j++) {
if (Cube2[i][j] != color)
return false;
}
}
return true;
}
void solution() {
for (int i = 1; i <= 6; i++) {//돌려질 면
for (int d = 0; d < 2; d++) {//0은 시계방향, 1은 반시계방향
bool flag = Turn(i, d);
if (flag == true) {
cout << 1 << '\n';
return;
}
}
}
cout << 0 << '\n';
return;
}
int main() {
ios_base::sync_with_stdio(0);
input();
solution();
return 0;
}
'백준 > 시뮬레이션,구현' 카테고리의 다른 글
(c++)백준 20055번: 컨베이어 벨트 위의 로봇 (0) | 2021.03.24 |
---|---|
(c++)백준 16974번: 레벨 햄버거 (0) | 2021.03.10 |
(c++)백준 17822번: 원판 돌리기 (0) | 2021.03.04 |
(c++)백준 17140번: 이차원 배열과 연산 (0) | 2020.10.17 |
(c++)백준 17143번: 낚시왕 (0) | 2020.10.17 |