티스토리 뷰
삼성 SW A형 문제로 알려진 큐빙문제입니다.
특별한 알고리즘은 필요 없이 정말 정말 열심히 구현하면 됩니다.
함수를 이용해 좀 더 깔끔하게 만들 수 있지만, 문제를 그려 가며 풀 때 전개로를 마구 그리다 보니 엄청난 하드코딩이되었습니다.
백준 사이트 질문에 어떤 분께서 예제를 올려주셔서 그거를 좀 더 활용하시면 좋을 것 같습니다.
풀이 : 윗면을 가운데 놓고 전개도를 그립니다. 전개도는 마음대로 그려도 되지만, 항상 같은 전개도를 사용해야 합니다.
전개도 위치 별로 인덱싱하여 어느 곳이 어디로 갈지 열심히 그리다 보면 답이 나옵니다!
(50%에서 1시간을 헤맸는데 1곳을 잘못 계산하고 있었다. 하드코딩을 하다보니 이런 게 보기 쉽지 않았다.)
저는 다음과 같은 전개도를 이용하였습니다.
뒤
왼 위 오른 밑
앞
코드는 다음과 같습니다.
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
// 큐브
// U위 - w흰색, D아래 - y노랑, F앞 - r빨강,
// B뒤 - o오렌지, L왼 - g초록, R오른 - b파랑
// + 시계, - 반시계
int t, n;
vector<pair<char, char>>v;
char cube[6][3][3];
char tmp[6][3][3];
// cube : 6 - 위,아래,앞,뒤,왼,오, 3*3 - 왼쪽 위(0,0), 오른쪽 아래 (2,2)
void init()
{
cin >> n;
v.clear();
// 회전 입력
for (int i = 0; i < n; i++) {
string s = "";
cin >> s;
v.push_back({ s[0],s[1] });
}
}
void cube_reset()
{
// 큐브 초기화
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 tmp_clear()
{
for (int i = 0; i < 6; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
tmp[i][j][k] = '.';
}
void rotate(char side, char dir)
{
switch (side) {
case 'U':
if (dir == '+') {
// 기준 면
tmp[0][0][0] = cube[0][2][0];
tmp[0][0][1] = cube[0][1][0];
tmp[0][0][2] = cube[0][0][0];
tmp[0][1][0] = cube[0][2][1];
tmp[0][1][1] = cube[0][1][1];
tmp[0][1][2] = cube[0][0][1];
tmp[0][2][0] = cube[0][2][2];
tmp[0][2][1] = cube[0][1][2];
tmp[0][2][2] = cube[0][0][2];
// 옆면
tmp[2][0][0] = cube[5][2][0];
tmp[2][0][1] = cube[5][1][0];
tmp[2][0][2] = cube[5][0][0];
tmp[3][2][0] = cube[4][2][2];
tmp[3][2][1] = cube[4][1][2];
tmp[3][2][2] = cube[4][0][2];
tmp[4][0][2] = cube[2][0][0];
tmp[4][1][2] = cube[2][0][1];
tmp[4][2][2] = cube[2][0][2];
tmp[5][0][0] = cube[3][2][0];
tmp[5][1][0] = cube[3][2][1];
tmp[5][2][0] = cube[3][2][2];
break;
}
else {
// 기준면
tmp[0][0][0] = cube[0][0][2];
tmp[0][0][1] = cube[0][1][2];
tmp[0][0][2] = cube[0][2][2];
tmp[0][1][0] = cube[0][0][1];
tmp[0][1][1] = cube[0][1][1];
tmp[0][1][2] = cube[0][2][1];
tmp[0][2][0] = cube[0][0][0];
tmp[0][2][1] = cube[0][1][0];
tmp[0][2][2] = cube[0][2][0];
//옆면
tmp[2][0][0] = cube[4][0][2];
tmp[2][0][1] = cube[4][1][2];
tmp[2][0][2] = cube[4][2][2];
tmp[3][2][0] = cube[5][0][0];
tmp[3][2][1] = cube[5][1][0];
tmp[3][2][2] = cube[5][2][0];
tmp[4][0][2] = cube[3][2][2];
tmp[4][1][2] = cube[3][2][1];
tmp[4][2][2] = cube[3][2][0];
tmp[5][0][0] = cube[2][0][2];
tmp[5][1][0] = cube[2][0][1];
tmp[5][2][0] = cube[2][0][0];
break;
}
case 'D':
if (dir == '+') {
// 기준면
tmp[1][0][0] = cube[1][2][0];
tmp[1][0][1] = cube[1][1][0];
tmp[1][0][2] = cube[1][0][0];
tmp[1][1][0] = cube[1][2][1];
tmp[1][1][1] = cube[1][1][1];
tmp[1][1][2] = cube[1][0][1];
tmp[1][2][0] = cube[1][2][2];
tmp[1][2][1] = cube[1][1][2];
tmp[1][2][2] = cube[1][0][2];
// 옆면
tmp[2][2][0] = cube[4][0][0];
tmp[2][2][1] = cube[4][1][0];
tmp[2][2][2] = cube[4][2][0];
tmp[3][0][0] = cube[5][0][2];
tmp[3][0][1] = cube[5][1][2];
tmp[3][0][2] = cube[5][2][2];
tmp[4][0][0] = cube[3][0][2];
tmp[4][1][0] = cube[3][0][1];
tmp[4][2][0] = cube[3][0][0];
tmp[5][0][2] = cube[2][2][2];
tmp[5][1][2] = cube[2][2][1];
tmp[5][2][2] = cube[2][2][0];
break;
}
else {
// 기준면
tmp[1][0][0] = cube[1][0][2];
tmp[1][0][1] = cube[1][1][2];
tmp[1][0][2] = cube[1][2][2];
tmp[1][1][0] = cube[1][0][1];
tmp[1][1][1] = cube[1][1][1];
tmp[1][1][2] = cube[1][2][1];
tmp[1][2][0] = cube[1][0][0];
tmp[1][2][1] = cube[1][1][0];
tmp[1][2][2] = cube[1][2][0];
//옆면
tmp[2][2][0] = cube[5][2][2];
tmp[2][2][1] = cube[5][1][2];
tmp[2][2][2] = cube[5][0][2];
tmp[3][0][0] = cube[4][2][0];
tmp[3][0][1] = cube[4][1][0];
tmp[3][0][2] = cube[4][0][0];
tmp[4][0][0] = cube[2][2][0];
tmp[4][1][0] = cube[2][2][1];
tmp[4][2][0] = cube[2][2][2];
tmp[5][0][2] = cube[3][0][0];
tmp[5][1][2] = cube[3][0][1];
tmp[5][2][2] = cube[3][0][2];
break;
}
case 'F':
if (dir == '+') {
// 기준면
tmp[2][0][0] = cube[2][2][0];
tmp[2][0][1] = cube[2][1][0];
tmp[2][0][2] = cube[2][0][0];
tmp[2][1][0] = cube[2][2][1];
tmp[2][1][1] = cube[2][1][1];
tmp[2][1][2] = cube[2][0][1];
tmp[2][2][0] = cube[2][2][2];
tmp[2][2][1] = cube[2][1][2];
tmp[2][2][2] = cube[2][0][2];
// 옆면
tmp[0][2][0] = cube[4][2][0];
tmp[0][2][1] = cube[4][2][1];
tmp[0][2][2] = cube[4][2][2];
tmp[1][2][0] = cube[5][2][0];
tmp[1][2][1] = cube[5][2][1];
tmp[1][2][2] = cube[5][2][2];
tmp[4][2][0] = cube[1][2][0];
tmp[4][2][1] = cube[1][2][1];
tmp[4][2][2] = cube[1][2][2];
tmp[5][2][0] = cube[0][2][0];
tmp[5][2][1] = cube[0][2][1];
tmp[5][2][2] = cube[0][2][2];
break;
}
else {
// 기준면
tmp[2][0][0] = cube[2][0][2];
tmp[2][0][1] = cube[2][1][2];
tmp[2][0][2] = cube[2][2][2];
tmp[2][1][0] = cube[2][0][1];
tmp[2][1][1] = cube[2][1][1];
tmp[2][1][2] = cube[2][2][1];
tmp[2][2][0] = cube[2][0][0];
tmp[2][2][1] = cube[2][1][0];
tmp[2][2][2] = cube[2][2][0];
//옆면
tmp[0][2][0] = cube[5][2][0];
tmp[0][2][1] = cube[5][2][1];
tmp[0][2][2] = cube[5][2][2];
tmp[1][2][0] = cube[4][2][0];
tmp[1][2][1] = cube[4][2][1];
tmp[1][2][2] = cube[4][2][2];
tmp[4][2][0] = cube[0][2][0];
tmp[4][2][1] = cube[0][2][1];
tmp[4][2][2] = cube[0][2][2];
tmp[5][2][0] = cube[1][2][0];
tmp[5][2][1] = cube[1][2][1];
tmp[5][2][2] = cube[1][2][2];
break;
}
case 'B':
if (dir == '+') {
// 기준면
tmp[3][0][0] = cube[3][2][0];
tmp[3][0][1] = cube[3][1][0];
tmp[3][0][2] = cube[3][0][0];
tmp[3][1][0] = cube[3][2][1];
tmp[3][1][1] = cube[3][1][1];
tmp[3][1][2] = cube[3][0][1];
tmp[3][2][0] = cube[3][2][2];
tmp[3][2][1] = cube[3][1][2];
tmp[3][2][2] = cube[3][0][2];
// 옆면
tmp[0][0][0] = cube[5][0][0];
tmp[0][0][1] = cube[5][0][1];
tmp[0][0][2] = cube[5][0][2];
tmp[1][0][0] = cube[4][0][0];
tmp[1][0][1] = cube[4][0][1];
tmp[1][0][2] = cube[4][0][2];
tmp[4][0][0] = cube[0][0][0];
tmp[4][0][1] = cube[0][0][1];
tmp[4][0][2] = cube[0][0][2];
tmp[5][0][0] = cube[1][0][0];
tmp[5][0][1] = cube[1][0][1];
tmp[5][0][2] = cube[1][0][2];
break;
}
else {
// 기준면
tmp[3][0][0] = cube[3][0][2];
tmp[3][0][1] = cube[3][1][2];
tmp[3][0][2] = cube[3][2][2];
tmp[3][1][0] = cube[3][0][1];
tmp[3][1][1] = cube[3][1][1];
tmp[3][1][2] = cube[3][2][1];
tmp[3][2][0] = cube[3][0][0];
tmp[3][2][1] = cube[3][1][0];
tmp[3][2][2] = cube[3][2][0];
//옆면
tmp[0][0][0] = cube[4][0][0];
tmp[0][0][1] = cube[4][0][1];
tmp[0][0][2] = cube[4][0][2];
tmp[1][0][0] = cube[5][0][0];
tmp[1][0][1] = cube[5][0][1];
tmp[1][0][2] = cube[5][0][2];
tmp[4][0][0] = cube[1][0][0];
tmp[4][0][1] = cube[1][0][1];
tmp[4][0][2] = cube[1][0][2];
tmp[5][0][0] = cube[0][0][0];
tmp[5][0][1] = cube[0][0][1];
tmp[5][0][2] = cube[0][0][2];
break;
}
case'L':
if (dir == '+') {
// 기준면
tmp[4][0][0] = cube[4][2][0];
tmp[4][0][1] = cube[4][1][0];
tmp[4][0][2] = cube[4][0][0];
tmp[4][1][0] = cube[4][2][1];
tmp[4][1][1] = cube[4][1][1];
tmp[4][1][2] = cube[4][0][1];
tmp[4][2][0] = cube[4][2][2];
tmp[4][2][1] = cube[4][1][2];
tmp[4][2][2] = cube[4][0][2];
// 옆면
tmp[0][0][0] = cube[3][0][0];
tmp[0][1][0] = cube[3][1][0];
tmp[0][2][0] = cube[3][2][0];
tmp[1][0][2] = cube[2][2][0];
tmp[1][1][2] = cube[2][1][0];
tmp[1][2][2] = cube[2][0][0];
tmp[2][0][0] = cube[0][0][0];
tmp[2][1][0] = cube[0][1][0];
tmp[2][2][0] = cube[0][2][0];
tmp[3][0][0] = cube[1][2][2];
tmp[3][1][0] = cube[1][1][2];
tmp[3][2][0] = cube[1][0][2];
break;
}
else {
// 기준면
tmp[4][0][0] = cube[4][0][2];
tmp[4][0][1] = cube[4][1][2];
tmp[4][0][2] = cube[4][2][2];
tmp[4][1][0] = cube[4][0][1];
tmp[4][1][1] = cube[4][1][1];
tmp[4][1][2] = cube[4][2][1];
tmp[4][2][0] = cube[4][0][0];
tmp[4][2][1] = cube[4][1][0];
tmp[4][2][2] = cube[4][2][0];
//옆면
tmp[0][0][0] = cube[2][0][0];
tmp[0][1][0] = cube[2][1][0];
tmp[0][2][0] = cube[2][2][0];
tmp[1][0][2] = cube[3][2][0];
tmp[1][1][2] = cube[3][1][0];
tmp[1][2][2] = cube[3][0][0];
tmp[2][0][0] = cube[1][2][2];
tmp[2][1][0] = cube[1][1][2];
tmp[2][2][0] = cube[1][0][2];
tmp[3][0][0] = cube[0][0][0];
tmp[3][1][0] = cube[0][1][0];
tmp[3][2][0] = cube[0][2][0];
break;
}
case'R':
if (dir == '+') {
// 기준면
tmp[5][0][0] = cube[5][2][0];
tmp[5][0][1] = cube[5][1][0];
tmp[5][0][2] = cube[5][0][0];
tmp[5][1][0] = cube[5][2][1];
tmp[5][1][1] = cube[5][1][1];
tmp[5][1][2] = cube[5][0][1];
tmp[5][2][0] = cube[5][2][2];
tmp[5][2][1] = cube[5][1][2];
tmp[5][2][2] = cube[5][0][2];
// 옆면
tmp[0][0][2] = cube[2][0][2];
tmp[0][1][2] = cube[2][1][2];
tmp[0][2][2] = cube[2][2][2];
tmp[1][0][0] = cube[3][2][2];
tmp[1][1][0] = cube[3][1][2];
tmp[1][2][0] = cube[3][0][2];
tmp[2][0][2] = cube[1][2][0];
tmp[2][1][2] = cube[1][1][0];
tmp[2][2][2] = cube[1][0][0];
tmp[3][0][2] = cube[0][0][2];
tmp[3][1][2] = cube[0][1][2];
tmp[3][2][2] = cube[0][2][2];
break;
}
else {
// 기준면
tmp[5][0][0] = cube[5][0][2];
tmp[5][0][1] = cube[5][1][2];
tmp[5][0][2] = cube[5][2][2];
tmp[5][1][0] = cube[5][0][1];
tmp[5][1][1] = cube[5][1][1];
tmp[5][1][2] = cube[5][2][1];
tmp[5][2][0] = cube[5][0][0];
tmp[5][2][1] = cube[5][1][0];
tmp[5][2][2] = cube[5][2][0];
//옆면
tmp[0][0][2] = cube[3][0][2];
tmp[0][1][2] = cube[3][1][2];
tmp[0][2][2] = cube[3][2][2];
tmp[1][0][0] = cube[2][2][2];
tmp[1][1][0] = cube[2][1][2];
tmp[1][2][0] = cube[2][0][2];
tmp[2][0][2] = cube[0][0][2];
tmp[2][1][2] = cube[0][1][2];
tmp[2][2][2] = cube[0][2][2];
tmp[3][0][2] = cube[1][2][0];
tmp[3][1][2] = cube[1][1][0];
tmp[3][2][2] = cube[1][0][0];
break;
}
}
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
if (tmp[i][j][k] != '.') {
cube[i][j][k] = tmp[i][j][k];
}
}
}
}
}
void print_upside()
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << cube[0][i][j];
}
cout << '\n';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> t;
while (t--) {
init();
cube_reset();
tmp_clear();
for (int i = 0; i < v.size(); i++) {
char side = v[i].first;
char dir = v[i].second;
rotate(side, dir);
tmp_clear();
}
print_upside();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 / 1238 파티 C++ (0) | 2021.04.12 |
---|---|
백준 / 1517 버블 소트 C++ (0) | 2021.04.09 |
백준 / 1509 팰린드롬 분할 C++ (0) | 2021.04.05 |
백준 / 1800 인터넷 설치 C++ (0) | 2021.04.03 |
백준 / 2174 로봇 시뮬레이션 C++ (0) | 2021.04.03 |
댓글