반응형
5373번: 큐빙
각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란
www.acmicpc.net
풀이 )
주사위의 6면을 각각 배열로 나타낸 다음 주어진 순서대로 큐브를 돌린다.
3차원 배열로 나타내면 헷갈릴까봐 6개의 2차원 배열로 나타냈다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void rotate(vector<vector<int>>& face, int dir){
int tmp = face[0][0];
if(dir == 1){ // 시계
int tmp2 = face[1][0];
face[0][0] = face[2][0];
face[1][0] = face[2][1];
face[2][0] = face[2][2];
face[2][1] = face[1][2];
face[2][2] = face[0][2];
face[1][2] = face[0][1];
face[0][2] = tmp;
face[0][1] = tmp2;
}
else{ // 반시계
int tmp2 = face[0][1];
face[0][0] = face[0][2];
face[0][1] = face[1][2];
face[0][2] = face[2][2];
face[1][2] = face[2][1];
face[2][2] = face[2][0];
face[2][1] = face[1][0];
face[2][0] = tmp;
face[1][0] = tmp2;
}
}
int main(void){
char color[] = {'w', 'r', 'g', 'b', 'o', 'y'};
int t;
cin >> t;
while(t--){
vector<vector<int>> u(3, vector<int>(3, 0));
vector<vector<int>> f(3, vector<int>(3, 1));
vector<vector<int>> l(3, vector<int>(3, 2));
vector<vector<int>> r(3, vector<int>(3, 3));
vector<vector<int>> b(3, vector<int>(3, 4));
vector<vector<int>> d(3, vector<int>(3, 5));
int n;
cin >> n;
while(n--){
string str;
cin >> str;
if(str == "L-"){
for(int i = 0; i < 3; ++i){
int tmp = f[i][0];
f[i][0] = d[i][0];
d[i][0] = b[i][0];
b[i][0] = u[i][0];
u[i][0] = tmp;
}
rotate(l, 0);
}
else if(str == "L+"){
for(int i = 0; i < 3; ++i){
int tmp = f[i][0];
f[i][0] = u[i][0];
u[i][0] = b[i][0];
b[i][0] = d[i][0];
d[i][0] = tmp;
}
rotate(l, 1);
}
else if(str == "R-"){
for(int i = 0; i < 3; ++i){
int tmp = f[i][2];
f[i][2] = u[i][2];
u[i][2] = b[i][2];
b[i][2] = d[i][2];
d[i][2] = tmp;
}
rotate(r, 0);
}
else if(str == "R+"){
for(int i = 0; i < 3; ++i){
int tmp = f[i][2];
f[i][2] = d[i][2];
d[i][2] = b[i][2];
b[i][2] = u[i][2];
u[i][2] = tmp;
}
rotate(r, 1);
}
else if(str == "F-"){
for(int i = 0; i < 3; ++i){
int tmp = u[2][i];
u[2][i] = r[2][i];
r[2][i] = d[0][2-i];
d[0][2-i] = l[2][i];
l[2][i] = tmp;
}
rotate(f, 0);
}
else if(str == "F+"){
for(int i = 0; i < 3; ++i){
int tmp = u[2][i];
u[2][i] = l[2][i];
l[2][i] = d[0][2-i];
d[0][2-i] = r[2][i];
r[2][i] = tmp;
}
rotate(f, 1);
}
else if(str == "B-"){
for(int i = 0; i < 3; ++i){
int tmp = u[0][i];
u[0][i] = l[0][i];
l[0][i] = d[2][2-i];
d[2][2-i] = r[0][i];
r[0][i] = tmp;
}
rotate(b, 0);
}
else if(str == "B+"){
for(int i = 0; i < 3; ++i){
int tmp = u[0][i];
u[0][i] = r[0][i];
r[0][i] = d[2][2-i];
d[2][2-i] = l[0][i];
l[0][i] = tmp;
}
rotate(b, 1);
}
else if(str == "U-"){
for(int i = 0; i < 3; ++i){
int tmp = f[0][i];
f[0][i] = l[i][2];
l[i][2] = b[2][2-i];
b[2][2-i] = r[2-i][0];
r[2-i][0] = tmp;
}
rotate(u, 0);
}
else if(str == "U+"){
for(int i = 0; i < 3; ++i){
int tmp = f[0][i];
f[0][i] = r[2-i][0];
r[2-i][0] = b[2][2-i];
b[2][2-i] = l[i][2];
l[i][2] = tmp;
}
rotate(u, 1);
}
else if(str == "D-"){
for(int i = 0; i < 3; ++i){
int tmp = f[2][i];
f[2][i] = r[2-i][2];
r[2-i][2] = b[0][2-i];
b[0][2-i] = l[i][0];
l[i][0] = tmp;
}
rotate(d, 0);
}
else{
for(int i = 0; i < 3; ++i){
int tmp = f[2][i];
f[2][i] = l[i][0];
l[i][0] = b[0][2-i];
b[0][2-i] = r[2-i][2];
r[2-i][2] = tmp;
}
rotate(d, 1);
}
}
for(int i = 0; i < 3; ++i){
for(int j = 0; j < 3; ++j)
cout << color[u[i][j]];
cout << '\n';
}
}
}
주의 )
회전할 때 각 면의 좌표를 잘 확인해야한다. 각 면의 기준 좌표에 따라 표현하는 방식이 달라지기 때문에 기준을 명확히 정하고, 빈 종이에 전개도를 그리면 실수가 준다.
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 - 4375 : 1 (0) | 2020.12.12 |
---|---|
[C++] 백준 - 1748 : 수 이어 쓰기 1 (0) | 2020.12.12 |
[C++] 백준 - 14502 : 연구소 (0) | 2020.12.09 |
[C++] 백준 - 9663 : N-Queen (0) | 2020.12.09 |
[C++] 백준 - 1065 : 한수 (0) | 2020.12.07 |