- 1๋จ๊ณ: ๋จ์ด ๋ฐ์ด๋ด๊ธฐ ๊ตฌํํ๊ธฐ
- 2๋จ๊ณ : ํ๋ฉด ํ๋ธ ๊ตฌํํ๊ธฐ
- 3๋จ๊ณ : ๋ฃจ๋น ์ค ํ๋ธ ๊ตฌํํ๊ธฐ
while (1)
{
cin >> word >> rotate_num >> direction;
if (-100 <= rotate_num && rotate_num < 100)
break;
else
cout << "์ ์๋ -100 <= N < 100 ์ผ๋ก ์
๋ ฅํด ์ฃผ์ธ์." << endl;
}
๋จ์ด์ ์ ์๋ฅผ ์ ๋ ฅํ ๋, ์ ์์ ๋ฒ์๋ฅผ ๋ง์กฑํด์ผ ๋จ์ด๋ฅผ ๋ฐ์ด๋ ๋๋ค.
if (direction == 'L' || direction == 'l' ||
(direction == 'R' && rotate_num < 0) || (direction == 'r' && rotate_num < 0))
{
rotate_num = abs(rotate_num) % word.length();
rotate(word.begin(), word.begin() + rotate_num, word.end());
}
else
{
rotate_num = abs(rotate_num) % word.length();
rotate(word.rbegin(), word.rbegin() + rotate_num, word.rend());
}
๋ฐฉํฅ์ 2๊ฐ์ง ๊ธฐ์ค์ผ๋ก ์ ํ๊ฒ ๋ฉ๋๋ค.
- ์ผ์ชฝ์ผ๋ก ๋ฐ๊ธฐ : L๊ณผ ์์ ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ๊ฑฐ๋, R๊ณผ ์์ ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ๋
- ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๊ธฐ : R๊ณผ ์์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ๊ฑฐ๋, L๊ณผ ์์ ์ ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ๋
๋ฐฉํฅ์ ์ ํ๋ค๋ฉด ๋จ์ด์ ๊ธธ์ด๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๊ณ , ๋๋จธ์ง ๋งํผ ํ์ ์ ํ๊ฒ ๋ฉ๋๋ค.
void cube_print(char cube_arr[][3])
{
for (int i = 0; i < 3; i++)
cout << cube_arr[i][0] << " " << cube_arr[i][1] << " " << cube_arr[i][2] << endl;
cout << endl;
}
ํ๋ฉด ํ๋ธ์ ์ํ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
void U_cw(char cube_arr[][3])
{
char temp = cube_arr[0][2];
cube_arr[0][2] = cube_arr[0][1];
cube_arr[0][1] = cube_arr[0][0];
cube_arr[0][0] = temp;
}
์ ํํ ์ค์ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ ๋๋ค.
void U_ccw(char cube_arr[][3])
{
char temp = cube_arr[0][0];
cube_arr[0][0] = cube_arr[0][1];
cube_arr[0][1] = cube_arr[0][2];
cube_arr[0][2] = temp;
}
์ ํํ ์ค์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ ๋๋ค. ์ ํจ์๋ค์ U, R, L, B๋ก ๋ฐฉํฅ์ ์ ํ ์ ์์ต๋๋ค.
cout << "CUBE> ";
cin >> input;
for (int i = 0; i < input.length(); i++)
{
str_temp = input[i];
if (i != input.length() - 1)
{
if (input[i + 1] == '\'')
{
str_temp += '\'';
i++;
}
}
input์ผ๋ก ์ฌ๋ฌ ๋ฌธ์๋ฅผ ์
๋ ฅ๋ฐ๊ฒ ๋๋ฉด ์ฐ์์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด
๋ฌธ์์ ๊ธธ์ด๋งํผ ๋ฐ๋ณตํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์๊ฐ ๋ฌธ์ ์ธ์ง ๋ฌธ์ + ' ์ธ์ง ๊ฒ์ถ์ ํ ํ, str_temp์ ๋ฃ์ด์ค๋๋ค.
if (str_temp == "U")
U_ccw(cube_arr);
else if (str_temp == "U'")
U_cw(cube_arr);
else if (str_temp == "R")
R_ccw(cube_arr);
else if (str_temp == "R'")
R_cw(cube_arr);
...
์ด์ str_temp๋ฅผ ํ์ธํ์ฌ ๊ทธ์ ๋ง๋ ๋ฐฉํฅ์ผ๋ก ํ๋ธ๋ฅผ ํ์ ์ํต๋๋ค.
else if (str_temp == "Q")
{
cout << "Bye~" << endl;
return 0;
}
'Q'๋ฅผ ์ ๋ ฅ ๋ฐ์ผ๋ฉด "Bye~"๋ฅผ ์ถ๋ ฅํ๊ณ ์ข ๋ฃํฉ๋๋ค.
char cubeU[3][3] = { {'B', 'B', 'B'}, {'B', 'B', 'B'}, {'B', 'B', 'B'} };
char cubeM1[3][3] = { {'W', 'W', 'W'}, {'W', 'W', 'W'}, {'W', 'W', 'W'} };
char cubeM2[3][3] = { {'O', 'O', 'O'}, {'O', 'O', 'O'}, {'O', 'O', 'O'} };
char cubeM3[3][3] = { {'G', 'G', 'G'}, {'G', 'G', 'G'}, {'G', 'G', 'G'} };
char cubeM4[3][3] = { {'Y', 'Y', 'Y'}, {'Y', 'Y', 'Y'}, {'Y', 'Y', 'Y'} };
char cubeL[3][3] = { {'R', 'R', 'R'}, {'R', 'R', 'R'}, {'R', 'R', 'R'} };
ํ๋ธ์ ๋ฉด์ ๊ธฐ์ค์ผ๋ก 3x3 ๋ฐฐ์ด์ ์ ์ญ๋ณ์๋ก ์์ฑํ์์ต๋๋ค.
void printCube()
{
for (int i = 0; i < 3; i++)
cout << "\t" << cubeU[i][0] << " " << cubeU[i][1] << " " << cubeU[i][2] << endl;
for (int i = 0; i < 3; i++)
{
cout << cubeM1[i][0] << " " << cubeM1[i][1] << " " << cubeM1[i][2] << "\t";
cout << cubeM2[i][0] << " " << cubeM2[i][1] << " " << cubeM2[i][2] << "\t";
cout << cubeM3[i][0] << " " << cubeM3[i][1] << " " << cubeM3[i][2] << "\t";
cout << cubeM4[i][0] << " " << cubeM4[i][1] << " " << cubeM4[i][2] << "\t" << endl;
}
for (int i = 0; i < 3; i++)
cout << "\t" << cubeL[i][0] << " " << cubeL[i][1] << " " << cubeL[i][2] << endl;
}
ํ๋ธ์ ๊ฐ ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.์ถ๋ ฅ ํ๋ฉด์ ์๋์ ๊ฐ์ต๋๋ค.
B B B
B B B
B B B
W W W O O O G G G Y Y Y
W W W O O O G G G Y Y Y
W W W O O O G G G Y Y Y
R R R
R R R
R R R
void rotateF_cw()
{
char temp[3] = {};
for (int i = 0; i < 3; i++)
{
temp[i] = cubeU[2][i];
cubeU[2][i] = cubeM1[2 - i][2];
cubeM1[2 - i][2] = cubeL[0][2 - i];
cubeL[0][2 - i] = cubeM3[i][0];
cubeM3[i][0] = temp[i];
}
for (int j = 0; j < 2; j++)
{
temp[j] = cubeM2[0][j];
cubeM2[0][j] = cubeM2[2 - j][0];
cubeM2[2 - j][0] = cubeM2[2][2 - j];
cubeM2[2][2 - j] = cubeM2[j][2];
cubeM2[j][2] = temp[j];
}
}
ํ๋ธ์ F, R, U, B, L, D ๋ถ๋ถ์ ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํฉ๋๋ค.
void rotateF_ccw()
{
char temp[3] = {};
for (int i = 0; i < 3; i++)
{
temp[i] = cubeU[2][i];
cubeU[2][i] = cubeM3[i][0];
cubeM3[i][0] = cubeL[0][2 - i];
cubeL[0][2 - i] = cubeM1[2 - i][2];
cubeM1[2 - i][2] = temp[i];
}
for (int j = 0; j < 2; j++)
{
temp[j] = cubeM2[0][j];
cubeM2[0][j] = cubeM2[j][2];
cubeM2[j][2] = cubeM2[2][2 - j];
cubeM2[2][2 - j] = cubeM2[2 - j][0];
cubeM2[2 - j][0] = temp[j];
}
}
ํ๋ธ์ F, R, U, B, L, D ๋ถ๋ถ์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํฉ๋๋ค.
string checkDirection(string input, int& index)
{
if (index != input.length() - 1)
{
if (input[index + 1] == '2' || input[index + 1] == '\'')
{
index++;
return input.substr(index - 1, 2);
}
}
return input.substr(index, 1);
}
main ํจ์์์ ์กฐ์์ ํ ์ค๋ก input์ ์ ๋ ฅ ๋ฐ์ผ๋ฉด ํ์ฌ index์ ์๋ ์กฐ์์ด ๋ฌด์์ธ์ง ํ๋จํ์ฌ ๋ฐํํฉ๋๋ค.
void rotateCube_cw(string direction, int& count)
{
if (direction[0] == 'F')
rotateF_cw();
else if (direction[0] == 'R')
rotateR_cw();
else if (direction[0] == 'U')
rotateU_cw();
else if (direction[0] == 'B')
rotateB_cw();
else if (direction[0] == 'L')
rotateL_cw();
else if (direction[0] == 'D')
rotateD_cw();
count++;
}
์กฐ์ ๋ฐฉํฅ์ด ๋ค์ด์๋ direction ๋ณ์๊ฐ ๋ฌด์์ธ์ง ํ๋จํ์ฌ ๊ทธ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ํจ์๋ฅผ ์คํํฉ๋๋ค.
์กฐ์๊ฐฏ์๋ฅผ ์นด์ดํธํ๊ธฐ ์ํด count๋ณ์๋ ์ด ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ์ฆ๊ฐํฉ๋๋ค.
void rotateCube_ccw(string direction, int& count)
{
int repeatNum = 0;
if (direction[1] == '2')
repeatNum++;
for (int i = 0; i <= repeatNum; i++)
{
if (direction[0] == 'F')
rotateF_ccw();
else if (direction[0] == 'R')
rotateR_ccw();
else if (direction[0] == 'U')
rotateU_ccw();
else if (direction[0] == 'B')
rotateB_ccw();
else if (direction[0] == 'L')
rotateL_ccw();
else if (direction[0] == 'D')
rotateD_ccw();
count++;
}
}
rotateCube_cw์ ๋ฐ๋๋ก, ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ํจ์๋ฅผ ์คํํฉ๋๋ค.
๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด ์ด ํจ์๋ ์กฐ์ ๋ฐฉํฅ์ ๋ํ๋ด๋ direction์ ๊ธธ์ด๊ฐ 2์ด๋ฉด ์คํํฉ๋๋ค.
ex) R', R2
๋ฐ๋ผ์ direction[1]์ ๊ฒ์ฌํ์ฌ ' ์ด๋ผ๋ฉด repeatNum์ 0์ด ๋์ด ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 1๋ฒ ํ์ ํ์ง๋ง,
direction[1]์ด 2 ๋ผ๋ฉด repeatNum์ 1์ด ๋์ด ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 2๋ฒ ํ์ ์์ผ
์์ R2์ ๊ฐ์ 2๋ฒ ํ์ ํ๋ ์ปค๋งจ๋๋ฅผ ์คํํฉ๋๋ค.
void printTime(chrono::system_clock::time_point startTime)
{
chrono::system_clock::time_point endTime = chrono::system_clock::now();
chrono::minutes min = chrono::duration_cast<chrono::minutes>(endTime - startTime);
chrono::seconds sec = chrono::duration_cast<chrono::seconds>(endTime - startTime);
int min60 = min.count() % 60;
int sec60 = sec.count() % 60;
cout << "๊ฒฝ๊ณผ์๊ฐ: " << setw(2) << setfill('0') << min60 << ":";
cout << setw(2) << setfill('0') << sec60 << endl;
}
๊ฒฝ๊ณผ์๊ฐ์ ๋ํ๋ด๊ธฐ ์ํ ํจ์์
๋๋ค.
00:00 ๋ก ๋ํ๋ด๊ธฐ ์ํด ์กฐ์ ์๋ฅผ ์ฌ์ฉํ๊ณ ๊ณต๋ฐฑ์ 0์ผ๋ก ์ฑ์ ์ต๋๋ค.
void shuffleCube()
{
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(0, 5);
for (int i = 0; i < 100; i++)
{
if (dis(gen) == 0)
rotateF_cw();
else if (dis(gen) == 1)
rotateR_cw();
else if (dis(gen) == 2)
rotateU_cw();
else if (dis(gen) == 3)
rotateB_cw();
else if (dis(gen) == 4)
rotateL_cw();
else if (dis(gen) == 5)
rotateD_cw();
}
}
ํ๋ธ๋ฅผ ๋ฌด์์๋ก ์๋ ํจ์์
๋๋ค.
๋์๋ฅผ ํตํด ์์ฑ๋ ๋ฌด์์ ์์ ๋ฐ๋ผ 100๋ฒ ์์ต๋๋ค.
string endFlagCheck(int& index, string input)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (cubeU[1][1] != cubeU[i][j] || cubeM1[1][1] != cubeM1[i][j] ||
cubeM2[1][1] != cubeM2[i][j] || cubeM3[1][1] != cubeM3[i][j] ||
cubeM4[1][1] != cubeM4[i][j] || cubeL[1][1] != cubeL[i][j])
return "NO";
}
}
index = input.length();
return "YES";
}
ํ๋ธ๊ฐ ๋ค ๋ง์ถ์ด ์ก๋์ง ํ์ธํ๋ ํจ์์
๋๋ค.
๋ค ๋ง์ถ์ด ์ก๋ค๋ฉด YES ๋ฅผ ๋ฐํํ์ฌ main ํจ์์์ ํ์ธํ๊ณ ์ข
๋ฃํฉ๋๋ค.
2์ค for๋ฌธ์ ํตํด ๊ฐ ๋ฉด์ด ๋ง์ถ์ด ์ก๋์ง ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ 4์ค์ด ๋์์ต๋๋ค.
int main()
{
chrono::system_clock::time_point startTime = chrono::system_clock::now();
string input = "";
string direction = "";
string endFlag = "NO";
int count = 0;
...
์ฒ์์ mainํจ์์์ ์ด๊ธฐํ ํ๋ ๋ณ์์
๋๋ค.
endFlag๋ NO๋ก ์์ํ์ฌ ์ฒ์ ํ๋ธ๊ฐ ๋ค ๋ง์ถ์ด์ง ์ํ์์ ์์ํ ๋, ์ข
๋ฃ๋จ์ ๋ฐฉ์งํฉ๋๋ค.
count๋ 0์ผ๋ก ์์ํ์ฌ ์ข
๋ฃ ์์ ์์ ์กฐ์๊ฐฏ์๋ฅผ ๋ํ๋
๋๋ค.
while (1)
{
if (endFlag == "NO")
{
cout << "CUBE> ";
cin >> input;
}
else
{
cout << "*****************************************************************" << endl;
cout << " ์ถํ๋๋ฆฝ๋๋ค! ํ๋ธ๋ฅผ ์์ฑํ์
จ์ต๋๋ค!" << endl;
cout << "*****************************************************************" << endl;
}
if (input == "Q" || endFlag == "YES")
{
printTime(startTime);
cout << "์กฐ์๊ฐฏ์: " << count << endl;
cout << "์ด์ฉํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋๋๋." << endl;
return 0;
}
...
์ฒ์ ์์ ์๋ endFlag = NO์ด๊ธฐ์ ํ๋ธ์ ์กฐ์์ ์
๋ ฅ๋ฐ๊ณ ์์ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ ํ์๋ Q๋ฅผ ์
๋ ฅํ๊ฑฐ๋, ํ๋ธ๊ฐ ๋ค ์์ฑ๋์์ ์
printTime(startTime)์ ํตํด ๊ฒฝ๊ณผ ์๊ฐ์ ์ถ๋ ฅํ๊ณ , count๋ฅผ ํตํด ์กฐ์๊ฐฏ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๊ทธ ํ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๊ฒ ๋ฉ๋๋ค.
...
if (input == "shuffle")
{
cout << "ํ๋ธ๋ฅผ ์์ต๋๋ค." << endl;
cout << "์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์." << endl;
shuffleCube();
printCube();
continue;
}
...
shuffle์ด ์
๋ ฅ๋๋ฉด ํ๋ธ๋ฅผ ์์ ํ ํ๋ธ์ ์ํ๋ฅผ ์ถ๋ ฅํ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ฒ์์ผ๋ก ๋์๊ฐ๋๋ค.
...
for (int index = 0; index < input.length(); index++)
{
direction = checkDirection(input, index);
cout << direction << endl;
if (direction.length() == 1)
rotateCube_cw(direction, count);
else
rotateCube_ccw(direction, count);
printCube();
endFlag = endFlagCheck(index, input);
}
}
...
Q์ shuffle์ด ์๋ ์กฐ์๋ฒ์ด ์
๋ ฅ์ด ๋๋ฉด checkDirection์ ํตํด direction์ ์กฐ์ ๋ฐฉํฅ์
์
๋ ฅํ๊ฒ ๋๊ณ , ๋จ์ ์กฐ์(F, R, U, B, L, D)์ด๋ผ๋ฉด rotateCube_cw๋ฅผ ํตํด ์๊ณ๋ฐฉํฅ ํ์ ์,
ํน์ ์กฐ์(F', F2 ...)์ด๋ผ๋ฉด rotateCube_ccw๋ฅผ ํตํด ๋ช
๋ น์ด์ ๋ฐ๋ฅธ ํ์ ์ ํฉ๋๋ค.
๊ทธ ํ printCube๋ฅผ ํตํด ํ๋ธ์ ์ํ๋ฅผ ์ถ๋ ฅํ๊ณ
endFlagCheck๋ฅผ ํตํด ํ๋ธ๊ฐ ๋ค ๋ง์ถ์ด ์ก๋์ง๋ฅผ ํ๋จํ๊ฒ ๋ฉ๋๋ค.