3차원 공간이다.
보는 관점에 따라 좌표의 값이 다르다는 점을 생각하면서 풀어야 한다.
윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색
위의 순서대로 0부터 5까지를 부여했다.
0일 때 3, 4, 5, 2와 맞닿는 가장 가까운 좌표를 0,0 0,1 0,2로 설정하고 작성했다.
각 면에 각도는 다 다르기에 맞닿는 면에 가장 가까운 좌표도 다 다르다. 그러한 점을 정말 유심히 생각하면서 풀어줘야 한다.
규칙이 존재하는지는 모르겠다. 어쩔 수 없이 하드코딩을 하기로 결심하고 풀었다. 어차피 구현 문제니까 요구한 바만 잘 따라주면 된다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
char cube[6][3][3], temp[3][3], tempLine[3];
void init()
{
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 roll(string &cmd)
{
char face = cmd[0];
int target;
if (face == 'U')
{
target = 0;
if (cmd[1] == '+')
{
tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][0][1], tempLine[2] = cube[5][0][2];
cube[5][0][0] = cube[3][0][0], cube[5][0][1] = cube[3][0][1], cube[5][0][2] = cube[3][0][2];
cube[3][0][0] = cube[4][0][0], cube[3][0][1] = cube[4][0][1], cube[3][0][2] = cube[4][0][2];
cube[4][0][0] = cube[2][0][0], cube[4][0][1] = cube[2][0][1], cube[4][0][2] = cube[2][0][2];
cube[2][0][0] = tempLine[0], cube[2][0][1] = tempLine[1], cube[2][0][2] = tempLine[2];
}
else
{
tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][0][1], tempLine[2] = cube[5][0][2];
cube[5][0][0] = cube[2][0][0], cube[5][0][1] = cube[2][0][1], cube[5][0][2] = cube[2][0][2];
cube[2][0][0] = cube[4][0][0], cube[2][0][1] = cube[4][0][1], cube[2][0][2] = cube[4][0][2];
cube[4][0][0] = cube[3][0][0], cube[4][0][1] = cube[3][0][1], cube[4][0][2] = cube[3][0][2];
cube[3][0][0] = tempLine[0], cube[3][0][1] = tempLine[1], cube[3][0][2] = tempLine[2];
}
}
else if (face == 'D')
{
target = 1;
if (cmd[1] == '+')
{
tempLine[0] = cube[5][2][0], tempLine[1] = cube[5][2][1], tempLine[2] = cube[5][2][2];
cube[5][2][0] = cube[2][2][0], cube[5][2][1] = cube[2][2][1], cube[5][2][2] = cube[2][2][2];
cube[2][2][0] = cube[4][2][0], cube[2][2][1] = cube[4][2][1], cube[2][2][2] = cube[4][2][2];
cube[4][2][0] = cube[3][2][0], cube[4][2][1] = cube[3][2][1], cube[4][2][2] = cube[3][2][2];
cube[3][2][0] = tempLine[0], cube[3][2][1] = tempLine[1], cube[3][2][2] = tempLine[2];
}
else
{
tempLine[0] = cube[5][2][0], tempLine[1] = cube[5][2][1], tempLine[2] = cube[5][2][2];
cube[5][2][0] = cube[3][2][0], cube[5][2][1] = cube[3][2][1], cube[5][2][2] = cube[3][2][2];
cube[3][2][0] = cube[4][2][0], cube[3][2][1] = cube[4][2][1], cube[3][2][2] = cube[4][2][2];
cube[4][2][0] = cube[2][2][0], cube[4][2][1] = cube[2][2][1], cube[4][2][2] = cube[2][2][2];
cube[2][2][0] = tempLine[0], cube[2][2][1] = tempLine[1], cube[2][2][2] = tempLine[2];
}
}
else if (face == 'F')
{
target = 2;
if (cmd[1] == '+')
{
tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][1][0], tempLine[2] = cube[5][2][0];
cube[5][0][0] = cube[0][2][0], cube[5][1][0] = cube[0][2][1], cube[5][2][0] = cube[0][2][2];
cube[0][2][0] = cube[4][2][2], cube[0][2][1] = cube[4][1][2], cube[0][2][2] = cube[4][0][2];
cube[4][2][2] = cube[1][0][2], cube[4][1][2] = cube[1][0][1], cube[4][0][2] = cube[1][0][0];
cube[1][0][2] = tempLine[0], cube[1][0][1] = tempLine[1], cube[1][0][0] = tempLine[2];
}
else
{
tempLine[0] = cube[5][0][0], tempLine[1] = cube[5][1][0], tempLine[2] = cube[5][2][0];
cube[5][0][0] = cube[1][0][2], cube[5][1][0] = cube[1][0][1], cube[5][2][0] = cube[1][0][0];
cube[1][0][2] = cube[4][2][2], cube[1][0][1] = cube[4][1][2], cube[1][0][0] = cube[4][0][2];
cube[4][2][2] = cube[0][2][0], cube[4][1][2] = cube[0][2][1], cube[4][0][2] = cube[0][2][2];
cube[0][2][0] = tempLine[0], cube[0][2][1] = tempLine[1], cube[0][2][2] = tempLine[2];
}
}
else if (face == 'B')
{
target = 3;
if (cmd[1] == '+')
{
tempLine[0] = cube[5][2][2], tempLine[1] = cube[5][1][2], tempLine[2] = cube[5][0][2];
cube[5][2][2] = cube[1][2][0], cube[5][1][2] = cube[1][2][1], cube[5][0][2] = cube[1][2][2];
cube[1][2][0] = cube[4][0][0], cube[1][2][1] = cube[4][1][0], cube[1][2][2] = cube[4][2][0];
cube[4][0][0] = cube[0][0][2], cube[4][1][0] = cube[0][0][1], cube[4][2][0] = cube[0][0][0];
cube[0][0][2] = tempLine[0], cube[0][0][1] = tempLine[1], cube[0][0][0] = tempLine[2];
}
else
{
tempLine[0] = cube[5][2][2], tempLine[1] = cube[5][1][2], tempLine[2] = cube[5][0][2];
cube[5][2][2] = cube[0][0][2], cube[5][1][2] = cube[0][0][1], cube[5][0][2] = cube[0][0][0];
cube[0][0][2] = cube[4][0][0], cube[0][0][1] = cube[4][1][0], cube[0][0][0] = cube[4][2][0];
cube[4][0][0] = cube[1][2][0], cube[4][1][0] = cube[1][2][1], cube[4][2][0] = cube[1][2][2];
cube[1][2][0] = tempLine[0], cube[1][2][1] = tempLine[1], cube[1][2][2] = tempLine[2];
}
}
else if (face == 'L')
{
target = 4;
if (cmd[1] == '+')
{
tempLine[0] = cube[0][0][0], tempLine[1] = cube[0][1][0], tempLine[2] = cube[0][2][0];
cube[0][0][0] = cube[3][2][2], cube[0][1][0] = cube[3][1][2], cube[0][2][0] = cube[3][0][2];
cube[3][2][2] = cube[1][0][0], cube[3][1][2] = cube[1][1][0], cube[3][0][2] = cube[1][2][0];
cube[1][0][0] = cube[2][0][0], cube[1][1][0] = cube[2][1][0], cube[1][2][0] = cube[2][2][0];
cube[2][0][0] = tempLine[0], cube[2][1][0] = tempLine[1], cube[2][2][0] = tempLine[2];
}
else
{
tempLine[0] = cube[0][0][0], tempLine[1] = cube[0][1][0], tempLine[2] = cube[0][2][0];
cube[0][0][0] = cube[2][0][0], cube[0][1][0] = cube[2][1][0], cube[0][2][0] = cube[2][2][0];
cube[2][0][0] = cube[1][0][0], cube[2][1][0] = cube[1][1][0], cube[2][2][0] = cube[1][2][0];
cube[1][0][0] = cube[3][2][2], cube[1][1][0] = cube[3][1][2], cube[1][2][0] = cube[3][0][2];
cube[3][2][2] = tempLine[0], cube[3][1][2] = tempLine[1], cube[3][0][2] = tempLine[2];
}
}
else
{
target = 5;
if (cmd[1] == '+')
{
tempLine[0] = cube[0][2][2], tempLine[1] = cube[0][1][2], tempLine[2] = cube[0][0][2];
cube[0][2][2] = cube[2][2][2], cube[0][1][2] = cube[2][1][2], cube[0][0][2] = cube[2][0][2];
cube[2][2][2] = cube[1][2][2], cube[2][1][2] = cube[1][1][2], cube[2][0][2] = cube[1][0][2];
cube[1][2][2] = cube[3][0][0], cube[1][1][2] = cube[3][1][0], cube[1][0][2] = cube[3][2][0];
cube[3][0][0] = tempLine[0], cube[3][1][0] = tempLine[1], cube[3][2][0] = tempLine[2];
}
else
{
tempLine[0] = cube[0][2][2], tempLine[1] = cube[0][1][2], tempLine[2] = cube[0][0][2];
cube[0][2][2] = cube[3][0][0], cube[0][1][2] = cube[3][1][0], cube[0][0][2] = cube[3][2][0];
cube[3][0][0] = cube[1][2][2], cube[3][1][0] = cube[1][1][2], cube[3][2][0] = cube[1][0][2];
cube[1][2][2] = cube[2][2][2], cube[1][1][2] = cube[2][1][2], cube[1][0][2] = cube[2][0][2];
cube[2][2][2] = tempLine[0], cube[2][1][2] = tempLine[1], cube[2][0][2] = tempLine[2];
}
}
if (cmd[1] == '+')
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
temp[j][3 - 1 - i] = cube[target][i][j];
else
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
temp[3 - 1 - j][i] = cube[target][i][j];
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
cube[target][i][j] = temp[i][j];
}
int main()
{
vector<string> v;
string cmd;
ios::sync_with_stdio(0), cin.tie(0);
int tc, n;
cin >> tc;
while (tc--)
{
init();
v.clear();
cin >> n;
while (n--)
{
cin >> cmd;
v.push_back(cmd);
}
for (int i = 0; i < v.size(); ++i)
{
if (i + 3 < v.size() && (v[i] == v[i + 1]) && (v[i + 1] == v[i + 2]) && (v[i + 2] == v[i + 3]))
{
i = i + 3;
continue;
}
else if (i + 1 < v.size() && v[i][0] == v[i + 1][0] && v[i][1] != v[i + 1][1])
{
i = i + 1;
continue;
}
roll(v[i]);
}
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
cout << cube[0][i][j];
cout << "\n";
}
}
return 0;
}
앞면을 작성할 때 자꾸 실수하는 느낌이 들어서 그냥 유니티로 대강 만들어서 해결했다.
이렇게 모형을 만들어서 하는데도 가끔 실수로 잘못 적으려 한 걸 보면 꽤 헷갈리는 문제다.
시험장에서 비슷한 문제가 나온다면 종이를 잘라서 큐브를 만들 것 같다.
추가로 같은 면에 대해서 같은 방향으로 회전을 4번 연속하거나 방향을 번갈아서 회전하는 경우는 무시해 주는 방식으로 구현해야 시간 초과가 나오지 않는다.