티스토리 뷰

알고리즘/백준

백준 / 5373 큐빙 C++

4567은 소수 2021. 4. 8. 21:10

www.acmicpc.net/problem/5373

 

5373번: 큐빙

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란

www.acmicpc.net

삼성 SW A형 문제로 알려진 큐빙문제입니다.

특별한 알고리즘은 필요 없이 정말 정말 열심히 구현하면 됩니다.

 

함수를 이용해 좀 더 깔끔하게 만들 수 있지만, 문제를 그려 가며 풀 때 전개로를 마구 그리다 보니 엄청난 하드코딩이되었습니다.

 

백준 사이트 질문에 어떤 분께서 예제를 올려주셔서 그거를 좀 더 활용하시면 좋을 것 같습니다.

 

풀이 : 윗면을 가운데 놓고 전개도를 그립니다. 전개도는 마음대로 그려도 되지만, 항상 같은 전개도를 사용해야 합니다.

전개도 위치 별로 인덱싱하여 어느 곳이 어디로 갈지 열심히 그리다 보면 답이 나옵니다!

(50%에서 1시간을 헤맸는데 1곳을 잘못 계산하고 있었다. 하드코딩을 하다보니 이런 게 보기 쉽지 않았다.)

 

저는 다음과 같은 전개도를 이용하였습니다.

    뒤

왼 위 오른 밑

    앞 

 

코드는 다음과 같습니다.

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>

using namespace std;

// 큐브
// U위 - w흰색, D아래 - y노랑, F앞 - r빨강,  
// B뒤 - o오렌지, L왼 - g초록, R오른 - b파랑
// + 시계, - 반시계

int t, n;
vector<pair<char, char>>v;
char cube[6][3][3]; 
char tmp[6][3][3];
// cube : 6 - 위,아래,앞,뒤,왼,오, 3*3 - 왼쪽 위(0,0), 오른쪽 아래 (2,2)

void init()
{
	cin >> n;
	v.clear();
	// 회전 입력
	for (int i = 0; i < n; i++) {
		string s = "";
		cin >> s;
		v.push_back({ s[0],s[1] });
	}
}

void cube_reset()
{
	// 큐브 초기화
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			cube[0][i][j] = 'w';
			cube[1][i][j] = 'y';
			cube[2][i][j] = 'r';
			cube[3][i][j] = 'o';
			cube[4][i][j] = 'g';
			cube[5][i][j] = 'b';
		}
	}
}

void tmp_clear()
{
	for (int i = 0; i < 6; i++)
		for (int j = 0; j < 3; j++)
			for (int k = 0; k < 3; k++)
				tmp[i][j][k] = '.';
}

void rotate(char side, char dir)
{
	switch (side) {
	case 'U':
		if (dir == '+') {
			// 기준 면
			tmp[0][0][0] = cube[0][2][0];
			tmp[0][0][1] = cube[0][1][0];
			tmp[0][0][2] = cube[0][0][0];
			tmp[0][1][0] = cube[0][2][1];
			tmp[0][1][1] = cube[0][1][1];
			tmp[0][1][2] = cube[0][0][1];
			tmp[0][2][0] = cube[0][2][2];
			tmp[0][2][1] = cube[0][1][2];
			tmp[0][2][2] = cube[0][0][2];
			// 옆면
			tmp[2][0][0] = cube[5][2][0];
			tmp[2][0][1] = cube[5][1][0];
			tmp[2][0][2] = cube[5][0][0];
			
			tmp[3][2][0] = cube[4][2][2];
			tmp[3][2][1] = cube[4][1][2];
			tmp[3][2][2] = cube[4][0][2];

			tmp[4][0][2] = cube[2][0][0];
			tmp[4][1][2] = cube[2][0][1];
			tmp[4][2][2] = cube[2][0][2];

			tmp[5][0][0] = cube[3][2][0];
			tmp[5][1][0] = cube[3][2][1];
			tmp[5][2][0] = cube[3][2][2];
			break;
		}
		else {
			// 기준면
			tmp[0][0][0] = cube[0][0][2];
			tmp[0][0][1] = cube[0][1][2];
			tmp[0][0][2] = cube[0][2][2];
			tmp[0][1][0] = cube[0][0][1];
			tmp[0][1][1] = cube[0][1][1];
			tmp[0][1][2] = cube[0][2][1];
			tmp[0][2][0] = cube[0][0][0];
			tmp[0][2][1] = cube[0][1][0];
			tmp[0][2][2] = cube[0][2][0];
			//옆면
			tmp[2][0][0] = cube[4][0][2];
			tmp[2][0][1] = cube[4][1][2];
			tmp[2][0][2] = cube[4][2][2];

			tmp[3][2][0] = cube[5][0][0];
			tmp[3][2][1] = cube[5][1][0];
			tmp[3][2][2] = cube[5][2][0];

			tmp[4][0][2] = cube[3][2][2];
			tmp[4][1][2] = cube[3][2][1];
			tmp[4][2][2] = cube[3][2][0];

			tmp[5][0][0] = cube[2][0][2];
			tmp[5][1][0] = cube[2][0][1];
			tmp[5][2][0] = cube[2][0][0];
			break;
		}
	case 'D':
		if (dir == '+') {
			// 기준면
			tmp[1][0][0] = cube[1][2][0];
			tmp[1][0][1] = cube[1][1][0];
			tmp[1][0][2] = cube[1][0][0];
			tmp[1][1][0] = cube[1][2][1];
			tmp[1][1][1] = cube[1][1][1];
			tmp[1][1][2] = cube[1][0][1];
			tmp[1][2][0] = cube[1][2][2];
			tmp[1][2][1] = cube[1][1][2];
			tmp[1][2][2] = cube[1][0][2];
			// 옆면
			tmp[2][2][0] = cube[4][0][0];
			tmp[2][2][1] = cube[4][1][0];
			tmp[2][2][2] = cube[4][2][0];

			tmp[3][0][0] = cube[5][0][2];
			tmp[3][0][1] = cube[5][1][2];
			tmp[3][0][2] = cube[5][2][2];

			tmp[4][0][0] = cube[3][0][2];
			tmp[4][1][0] = cube[3][0][1];
			tmp[4][2][0] = cube[3][0][0];

			tmp[5][0][2] = cube[2][2][2];
			tmp[5][1][2] = cube[2][2][1];
			tmp[5][2][2] = cube[2][2][0];
			break;
		}
		else {
			// 기준면
			tmp[1][0][0] = cube[1][0][2];
			tmp[1][0][1] = cube[1][1][2];
			tmp[1][0][2] = cube[1][2][2];
			tmp[1][1][0] = cube[1][0][1];
			tmp[1][1][1] = cube[1][1][1];
			tmp[1][1][2] = cube[1][2][1];
			tmp[1][2][0] = cube[1][0][0];
			tmp[1][2][1] = cube[1][1][0];
			tmp[1][2][2] = cube[1][2][0];
			//옆면
			tmp[2][2][0] = cube[5][2][2];
			tmp[2][2][1] = cube[5][1][2];
			tmp[2][2][2] = cube[5][0][2];

			tmp[3][0][0] = cube[4][2][0];
			tmp[3][0][1] = cube[4][1][0];
			tmp[3][0][2] = cube[4][0][0];

			tmp[4][0][0] = cube[2][2][0];
			tmp[4][1][0] = cube[2][2][1];
			tmp[4][2][0] = cube[2][2][2];

			tmp[5][0][2] = cube[3][0][0];
			tmp[5][1][2] = cube[3][0][1];
			tmp[5][2][2] = cube[3][0][2];
			break;
		}
	case 'F':
		if (dir == '+') {
			// 기준면
			tmp[2][0][0] = cube[2][2][0];
			tmp[2][0][1] = cube[2][1][0];
			tmp[2][0][2] = cube[2][0][0];
			tmp[2][1][0] = cube[2][2][1];
			tmp[2][1][1] = cube[2][1][1];
			tmp[2][1][2] = cube[2][0][1];
			tmp[2][2][0] = cube[2][2][2];
			tmp[2][2][1] = cube[2][1][2];
			tmp[2][2][2] = cube[2][0][2];
			// 옆면
			tmp[0][2][0] = cube[4][2][0];
			tmp[0][2][1] = cube[4][2][1];
			tmp[0][2][2] = cube[4][2][2];

			tmp[1][2][0] = cube[5][2][0];
			tmp[1][2][1] = cube[5][2][1];
			tmp[1][2][2] = cube[5][2][2];

			tmp[4][2][0] = cube[1][2][0];
			tmp[4][2][1] = cube[1][2][1];
			tmp[4][2][2] = cube[1][2][2];

			tmp[5][2][0] = cube[0][2][0];
			tmp[5][2][1] = cube[0][2][1];
			tmp[5][2][2] = cube[0][2][2];
			break;
		}
		else {
			// 기준면
			tmp[2][0][0] = cube[2][0][2];
			tmp[2][0][1] = cube[2][1][2];
			tmp[2][0][2] = cube[2][2][2];
			tmp[2][1][0] = cube[2][0][1];
			tmp[2][1][1] = cube[2][1][1];
			tmp[2][1][2] = cube[2][2][1];
			tmp[2][2][0] = cube[2][0][0];
			tmp[2][2][1] = cube[2][1][0];
			tmp[2][2][2] = cube[2][2][0];
			//옆면
			tmp[0][2][0] = cube[5][2][0];
			tmp[0][2][1] = cube[5][2][1];
			tmp[0][2][2] = cube[5][2][2];

			tmp[1][2][0] = cube[4][2][0];
			tmp[1][2][1] = cube[4][2][1];
			tmp[1][2][2] = cube[4][2][2];

			tmp[4][2][0] = cube[0][2][0];
			tmp[4][2][1] = cube[0][2][1];
			tmp[4][2][2] = cube[0][2][2];

			tmp[5][2][0] = cube[1][2][0];
			tmp[5][2][1] = cube[1][2][1];
			tmp[5][2][2] = cube[1][2][2];
			break;
		}
	case 'B':
		if (dir == '+') {
			// 기준면
			tmp[3][0][0] = cube[3][2][0];
			tmp[3][0][1] = cube[3][1][0];
			tmp[3][0][2] = cube[3][0][0];
			tmp[3][1][0] = cube[3][2][1];
			tmp[3][1][1] = cube[3][1][1];
			tmp[3][1][2] = cube[3][0][1];
			tmp[3][2][0] = cube[3][2][2];
			tmp[3][2][1] = cube[3][1][2];
			tmp[3][2][2] = cube[3][0][2];
			// 옆면
			tmp[0][0][0] = cube[5][0][0];
			tmp[0][0][1] = cube[5][0][1];
			tmp[0][0][2] = cube[5][0][2];

			tmp[1][0][0] = cube[4][0][0];
			tmp[1][0][1] = cube[4][0][1];
			tmp[1][0][2] = cube[4][0][2];

			tmp[4][0][0] = cube[0][0][0];
			tmp[4][0][1] = cube[0][0][1];
			tmp[4][0][2] = cube[0][0][2];

			tmp[5][0][0] = cube[1][0][0];
			tmp[5][0][1] = cube[1][0][1];
			tmp[5][0][2] = cube[1][0][2];
			break;
		}
		else {
			// 기준면
			tmp[3][0][0] = cube[3][0][2];
			tmp[3][0][1] = cube[3][1][2];
			tmp[3][0][2] = cube[3][2][2];
			tmp[3][1][0] = cube[3][0][1];
			tmp[3][1][1] = cube[3][1][1];
			tmp[3][1][2] = cube[3][2][1];
			tmp[3][2][0] = cube[3][0][0];
			tmp[3][2][1] = cube[3][1][0];
			tmp[3][2][2] = cube[3][2][0];
			//옆면
			tmp[0][0][0] = cube[4][0][0];
			tmp[0][0][1] = cube[4][0][1];
			tmp[0][0][2] = cube[4][0][2];

			tmp[1][0][0] = cube[5][0][0];
			tmp[1][0][1] = cube[5][0][1];
			tmp[1][0][2] = cube[5][0][2];

			tmp[4][0][0] = cube[1][0][0];
			tmp[4][0][1] = cube[1][0][1];
			tmp[4][0][2] = cube[1][0][2];

			tmp[5][0][0] = cube[0][0][0];
			tmp[5][0][1] = cube[0][0][1];
			tmp[5][0][2] = cube[0][0][2];
			break;
		}
	case'L':
		if (dir == '+') {
			// 기준면
			tmp[4][0][0] = cube[4][2][0];
			tmp[4][0][1] = cube[4][1][0];
			tmp[4][0][2] = cube[4][0][0];
			tmp[4][1][0] = cube[4][2][1];
			tmp[4][1][1] = cube[4][1][1];
			tmp[4][1][2] = cube[4][0][1];
			tmp[4][2][0] = cube[4][2][2];
			tmp[4][2][1] = cube[4][1][2];
			tmp[4][2][2] = cube[4][0][2];
			// 옆면
			tmp[0][0][0] = cube[3][0][0];
			tmp[0][1][0] = cube[3][1][0];
			tmp[0][2][0] = cube[3][2][0];

			tmp[1][0][2] = cube[2][2][0];
			tmp[1][1][2] = cube[2][1][0];
			tmp[1][2][2] = cube[2][0][0];

			tmp[2][0][0] = cube[0][0][0];
			tmp[2][1][0] = cube[0][1][0];
			tmp[2][2][0] = cube[0][2][0];

			tmp[3][0][0] = cube[1][2][2];
			tmp[3][1][0] = cube[1][1][2];
			tmp[3][2][0] = cube[1][0][2];
			break;
		}
		else {
			// 기준면
			tmp[4][0][0] = cube[4][0][2];
			tmp[4][0][1] = cube[4][1][2];
			tmp[4][0][2] = cube[4][2][2];
			tmp[4][1][0] = cube[4][0][1];
			tmp[4][1][1] = cube[4][1][1];
			tmp[4][1][2] = cube[4][2][1];
			tmp[4][2][0] = cube[4][0][0];
			tmp[4][2][1] = cube[4][1][0];
			tmp[4][2][2] = cube[4][2][0];
			//옆면
			tmp[0][0][0] = cube[2][0][0];
			tmp[0][1][0] = cube[2][1][0];
			tmp[0][2][0] = cube[2][2][0];

			tmp[1][0][2] = cube[3][2][0];
			tmp[1][1][2] = cube[3][1][0];
			tmp[1][2][2] = cube[3][0][0];

			tmp[2][0][0] = cube[1][2][2];
			tmp[2][1][0] = cube[1][1][2];
			tmp[2][2][0] = cube[1][0][2];

			tmp[3][0][0] = cube[0][0][0];
			tmp[3][1][0] = cube[0][1][0];
			tmp[3][2][0] = cube[0][2][0];
			break;
		}
	case'R':
		if (dir == '+') {
			// 기준면
			tmp[5][0][0] = cube[5][2][0];
			tmp[5][0][1] = cube[5][1][0];
			tmp[5][0][2] = cube[5][0][0];
			tmp[5][1][0] = cube[5][2][1];
			tmp[5][1][1] = cube[5][1][1];
			tmp[5][1][2] = cube[5][0][1];
			tmp[5][2][0] = cube[5][2][2];
			tmp[5][2][1] = cube[5][1][2];
			tmp[5][2][2] = cube[5][0][2];
			// 옆면
			tmp[0][0][2] = cube[2][0][2];
			tmp[0][1][2] = cube[2][1][2];
			tmp[0][2][2] = cube[2][2][2];

			tmp[1][0][0] = cube[3][2][2];
			tmp[1][1][0] = cube[3][1][2];
			tmp[1][2][0] = cube[3][0][2];

			tmp[2][0][2] = cube[1][2][0];
			tmp[2][1][2] = cube[1][1][0];
			tmp[2][2][2] = cube[1][0][0];

			tmp[3][0][2] = cube[0][0][2];
			tmp[3][1][2] = cube[0][1][2];
			tmp[3][2][2] = cube[0][2][2];
			break;
		}
		else {
			// 기준면
			tmp[5][0][0] = cube[5][0][2];
			tmp[5][0][1] = cube[5][1][2];
			tmp[5][0][2] = cube[5][2][2];
			tmp[5][1][0] = cube[5][0][1];
			tmp[5][1][1] = cube[5][1][1];
			tmp[5][1][2] = cube[5][2][1];
			tmp[5][2][0] = cube[5][0][0];
			tmp[5][2][1] = cube[5][1][0];
			tmp[5][2][2] = cube[5][2][0];
			//옆면
			tmp[0][0][2] = cube[3][0][2];
			tmp[0][1][2] = cube[3][1][2];
			tmp[0][2][2] = cube[3][2][2];

			tmp[1][0][0] = cube[2][2][2];
			tmp[1][1][0] = cube[2][1][2];
			tmp[1][2][0] = cube[2][0][2];

			tmp[2][0][2] = cube[0][0][2];
			tmp[2][1][2] = cube[0][1][2];
			tmp[2][2][2] = cube[0][2][2];

			tmp[3][0][2] = cube[1][2][0];
			tmp[3][1][2] = cube[1][1][0];
			tmp[3][2][2] = cube[1][0][0];
			break;
		}
	}

	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				if (tmp[i][j][k] != '.') {
					cube[i][j][k] = tmp[i][j][k];
				}
			}
		}
	}
}

void print_upside()
{
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			cout << cube[0][i][j];
		}
		cout << '\n';
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> t;
	while (t--) {
		init();
		cube_reset();
		tmp_clear();

		for (int i = 0; i < v.size(); i++) {
			char side = v[i].first;
			char dir = v[i].second;
			rotate(side, dir);
			tmp_clear();
		}

		print_upside();
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 1238 파티 C++  (0) 2021.04.12
백준 / 1517 버블 소트 C++  (0) 2021.04.09
백준 / 1509 팰린드롬 분할 C++  (0) 2021.04.05
백준 / 1800 인터넷 설치 C++  (0) 2021.04.03
백준 / 2174 로봇 시뮬레이션 C++  (0) 2021.04.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함