본문 바로가기

백준/삼성기출

큐빙

728x90

www.acmicpc.net/problem/5373

 

5373번: 큐빙

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <map>
#include <cstring>

using namespace std;

enum FACE {U,D,F,B,L,R,SIZE}; // 위,아래,앞,뒤,왼,오
char arr[55];
int cube[SIZE][3][3];
char temp[3][3];
char init[7] = "wyrogb";

// 전개도 그리고 시작하기 
/*            U
0  1  2
3  4  5
6  7  8
L        __________    R            B
36 37 38|F18 19 20 | 45 46 47 | 27 28 29
39 40 41| 21 22 23 | 48 49 50 | 30 31 32
42 43 44| 24 25 26 | 51 52 53 | 33 34 35
-----------
9  10 11
12 13 14
15 16 17
D
*/

int rot[6][12] = {
	{ 36,37,38,18,19,20,45,46,47,27,28,29 },        //U
	{ 33,34,35,51,52,53,24,25,26,42,43,44 },        //D
	{ 6,7,8,44,41,38,11,10,9,45,48,51 },            //F
	{ 2,1,0,53,50,47,15,16,17,36,39,42 },            //B
	{ 0,3,6,35,32,29,9,12,15,18,21,24 },            //L
	{ 8,5,2,26,23,20,17,14,11,27,30,33 }            //R
};


void rotate(FACE f, int cnt) {

	char que[12];

	while (cnt--) {
		
		for (int i = 0; i < 12; i++) {
			que[i] = arr[rot[f][i]]; //큐에 데이터를 넣는다.
		}
		for (int i = 0; i < 12; i++) {
			arr[rot[f][i]] = que[(i + 3) % 12]; //큐를 3칸 밀어서 넣는다.
		}

		//면을 돌린다.
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++) {
			temp[j][2 - i] = arr[cube[f][i][j]];
		}
		
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++) 
			arr[cube[f][i][j]] = temp[i][j];
	
	}

	
}

int conv[256];

int main() {
	
	conv['-'] = 3;
	conv['+'] = 1;
	conv['U'] = U;
	conv['D'] = D;
	conv['F'] = F;
	conv['B'] = B;
	conv['L'] = L;
	conv['R'] = R;

	//큐브 인덱스 부여하기 
	for (int i = 0; i < SIZE; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
			
				cube[i][j][k] = i * 9 + j * 3 + k;
			}
		}
	}

	int n, m;
	char comm[3];
	
	cin >> n;

	while (n--) {
		
		//큐브 초기화
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 9; j++) {
				
				arr[i * 9 + j] = init[i];
			}
		}

		cin >> m;

		while (m--) {
			
			cin >> comm;
			int f = conv[comm[0]], cnt = conv[comm[1]];
			rotate((FACE)f, cnt);

		
		}

		//출력
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
			
				cout << arr[cube[U][i][j]];
			}
			cout << endl;
		}
	}

	return 0;


}

sangdo913.tistory.com/185

 

[삼성 기출 문제] 백준 5373 큐빙

문제 링크 어떻게 풀까? 진정한 시뮬레이션입니다. 정말... 말 그대로 3x3x3 큐브의 U D F B L R을 시계방향과 반시계방향으로 돌리는 것을 구현하면 됩니다! -끝- 이라고 하기엔 너무 힘들고 가혹한

sangdo913.tistory.com

블로그 코드 참고

'백준 > 삼성기출' 카테고리의 다른 글

어른상어 - 19237번 (JAVA)  (0) 2021.09.16
마법사 상어와 파이어볼 / 시뮬레이션  (0) 2021.04.23
치킨 배달  (0) 2021.04.19
드래곤 커브  (0) 2021.04.18
어른상어/ 시뮬레이션  (0) 2021.04.12