Study hard

(c++)백준 16939번: 2x2x2큐브 본문

백준/시뮬레이션,구현

(c++)백준 16939번: 2x2x2큐브

Nimgnoej 2021. 3. 5. 23:40

www.acmicpc.net/problem/16939

 

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;
}