BOJ 5373 :: 큐빙
문제 링크 : https://www.acmicpc.net/problem/5373
아무리 생각해도 노가다 방법밖에 생각이 안나서 ㅠㅠ
그렇게 풀기 싫어가지구.. 백준님 푸는 방법을 보고 공부해서 직접 같은 방식으로 구현해 보았다!
문제를 보고 이렇게 푸는 방식을 생각하시다니.. 대단한 것 같다!! 그리고 개발환경 안쓰시고 문제 제출하는 창에 직접 코딩하심 ㄹㅇ...후덜덜ㅎ...
참고 링크 : https://www.youtube.com/watch?v=8XJcnUPIu_Q
나의 풀이
시계방향이동하는 것을 구현하면 반시계방향 이동하는 것을 구현할 필요가 없다!
시계방향으로 세 번 이동한 것이 반시계방향으로 한 번 이동한 것과 같기 때문!
이를 제외하고 남은 6가지 경우 U, D, F, B, L, R 도 모두 구현할 필요가 없다!
큐브를 굴린다면 두 가지 구현만으로도(코드에서는 L과 R) 모든 구현을 해낼 수 있다!
U : 큐브의 윗면을 오른쪽면으로 굴린 후, 좌표를 갱신해주는 함수
F : 큐브의 앞면을 왼쪽면으로 굴린 후, 좌표를 갱신해주는 함수
L : 왼쪽면 큐브를 돌린 후, 왼쪽면의 값도 바꿔주는 함수
R : 오른쪽면 큐브를 돌린 후, 오른쪽면의 값도 바꿔주는 함수
(각 큐브 면의 (0,0) 위치)
Ex) U-
U함수로 큐브의 윗면을 오른쪽면으로 굴린 후, 좌표를 갱신한다.
R함수로 큐브의 오른쪽면을 시계방향으로 세 번 돌린다. (= 이는 반시계방향으로 한 번 돌린 것과 같다.)
U함수로 큐브의 윗면을 오른쪽면으로 세 번 굴린다. (= 아까 한 번 돌린 것과 합치면 총 4번이 되기 때문에 기존의 윗면이 있던 제자리로 돌아온다.)
나의 코드
Github :
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | // 백준알고리즘 5373번 :: 큐빙 #include<iostream> #include<vector> #include<string> using namespace std; int T, n; void clockwise(vector<vector<char>>&a) { char temp = a[0][0]; a[0][0] = a[2][0]; a[2][0] = a[2][2]; a[2][2] = a[0][2]; a[0][2] = temp; temp = a[0][1]; a[0][1] = a[1][0]; a[1][0] = a[2][1]; a[2][1] = a[1][2]; a[1][2] = temp; return; } void U(vector<vector<vector<char>>>&a) { vector<vector<char>> temp = a[5]; a[5] = a[0]; a[0] = a[4]; a[4] = a[1]; a[1] = temp; clockwise(a[1]); clockwise(a[1]); clockwise(a[4]); clockwise(a[4]); clockwise(a[2]); clockwise(a[3]); clockwise(a[3]); clockwise(a[3]); return; } void F(vector<vector<vector<char>>>&a) { vector<vector<char>> temp = a[2]; a[2] = a[5]; a[5] = a[3]; a[3] = a[4]; a[4] = temp; clockwise(a[2]); clockwise(a[4]); clockwise(a[3]); clockwise(a[5]); clockwise(a[1]); clockwise(a[1]); clockwise(a[1]); clockwise(a[0]); return; } void L(vector<vector<vector<char>>>&a) { // 0 -> 2 -> 1 -> 3 vector<vector<char>> temp = a[0]; for (int i = 0; i < 3; i++) { a[0][i][0] = a[3][i][0]; a[3][i][0] = a[1][i][0]; a[1][i][0] = a[2][i][0]; a[2][i][0] = temp[i][0]; } clockwise(a[4]); return; } void R(vector<vector<vector<char>>>&a) { // 0 -> 3 -> 1 -> 2 vector<vector<char>> temp = a[0]; for (int i = 0; i < 3; i++) { a[0][i][2] = a[2][i][2]; a[2][i][2] = a[1][i][2]; a[1][i][2] = a[3][i][2]; a[3][i][2] = temp[i][2]; } clockwise(a[5]); return; } int main(void) { cin >> T; string str; while (T--) { vector<vector<vector<char>>> cube; cube.push_back(vector<vector<char>>(3, vector<char>(3, 'w'))); cube.push_back(vector<vector<char>>(3, vector<char>(3, 'y'))); cube.push_back(vector<vector<char>>(3, vector<char>(3, 'r'))); cube.push_back(vector<vector<char>>(3, vector<char>(3, 'o'))); cube.push_back(vector<vector<char>>(3, vector<char>(3, 'g'))); cube.push_back(vector<vector<char>>(3, vector<char>(3, 'b'))); cin >> n; for (int i = 0; i < n; i++) { cin >> str; int k = 1; if (str[1] == '-') k = 3; if (str[0] == 'U') { U(cube); for (int j = 0; j < k; j++) R(cube); for (int j = 0; j < 3; j++) U(cube); } else if (str[0] == 'D') { U(cube); for (int j = 0; j < k; j++) L(cube); for (int j = 0; j < 3; j++) U(cube); } else if (str[0] == 'F') { F(cube); for (int j = 0; j < k; j++) L(cube); for (int j = 0; j < 3; j++) F(cube); } else if (str[0] == 'B') { F(cube); for (int j = 0; j < k; j++) R(cube); for (int j = 0; j < 3; j++) F(cube); } else if (str[0] == 'L') { for(int j = 0; j < k; j++) L(cube); } else if (str[0] == 'R') { for (int j = 0; j < k; j++) R(cube); } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) cout << cube[0][i][j]; cout << '\n'; } } return 0; } | cs |
'Problem > 시뮬레이션' 카테고리의 다른 글
[C/C++] BOJ 3048 :: 개미 (0) | 2019.03.20 |
---|---|
[C/C++] BOJ 16235 :: 나무 재테크 (0) | 2019.03.04 |
[SW Expert Academy] 1210. Ladder1 (0) | 2019.02.26 |
[C/C++] BOJ 1331 :: 나이트 투어 (0) | 2019.02.08 |
[C/C++] BOJ 13901 :: 로봇 (0) | 2019.02.07 |