선택과 집중
백준 5373번(큐빙) c++ 풀이 본문
https://www.acmicpc.net/problem/5373
보고 로직은 빨리 떠올랐는데 구현할 때 살짝 까다로워서 오래 걸렸다..
전역변수 side에 값 넣을 때 방향이나,, junc 배열 채울 때 B가 뒤집어져있으니까 종이에다가 그려가면서 난리쳤다 ㅠ
확실히 3차원적으로 생각해야하는 문제에 약한 것 같음...
그리고 변수이름 정하기 힘들다..ㅋㅋ 구글에 "접합 영어로" "큐브 돌리다 영어로"
...
우선은 큐브의 한 면을
0 1 2
3 4 5
6 7 8
이렇게 생각하는데, up right down left 의 4가지 side로 구분했다.
side[]에 저장할 때 아무렇게나 하는 게 아니라 큐브의 회전을 생각해서 할당해줘야한다. (구현이 쉬우려면)
0에서부터 시계방향으로 진행하도록 해줬다.
012(up) 258(right) 876(down) 630(left)
junc[]도 순서에 의미를 줬다..
[0]은 해당 면의 up side와 접하는 {face, side}
[1], [2], [3]은 right, down, left
즉 시계방향이다.
이렇게만 세팅해주면 나머지는 단순구현..
원형으로 돌려가면서 한 칸씩 shift??느낌으로다가 이동시켜주면 된다.
#include <iostream>
#include <map>
using namespace std;
#define U 0
#define D 1
#define F 2
#define B 3
#define L 4
#define R 5
#define U_SIDE 0
#define R_SIDE 1
#define L_SIDE 2
#define D_SIDE 3
typedef struct cube_junc{
int face;
int side;
} cube_junc;
int side[4][3] = {
{0, 1, 2}, // 0: up
{2, 5, 8}, // 1: right
{6, 3, 0}, // 2: left
{8, 7, 6} // 3: down
};
cube_junc junc[6][4] = {
{{B, U_SIDE}, {R, U_SIDE}, {F, U_SIDE}, {L, U_SIDE}}, // U => B up, R up, F up, L up
{{F, D_SIDE}, {R, D_SIDE}, {B, D_SIDE}, {L, D_SIDE}}, // D => F down, R down, B down, L down
{{U, D_SIDE}, {R, L_SIDE}, {D, U_SIDE}, {L, R_SIDE}}, // F => U down, R left, D up, L right
{{U, U_SIDE}, {L, L_SIDE}, {D, D_SIDE}, {R, R_SIDE}}, // B => U up, L left, D down, R right
{{U, L_SIDE}, {F, L_SIDE}, {D, L_SIDE}, {B, R_SIDE}}, // L => U left, F left, D left, B right
{{U, R_SIDE}, {B, L_SIDE}, {D, R_SIDE}, {F, R_SIDE}} // R => U right, B left, D right, F right
};
map<char, int> faceNum;
int n;
string comm[1000];
char cube[6][9];
void copySide(int face, int fromIdx, int toIdx){
cube_junc from = junc[face][fromIdx];
cube_junc to = junc[face][toIdx];
for(int i=0; i<3; i++){
cube[to.face][side[to.side][i]] = cube[from.face][side[from.side][i]];
}
return;
}
void spinCw(int face){ // 시계방향(+)
char tmp[3];
for(int i=0; i<2; i++){
tmp[i] = cube[face][side[U_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[U_SIDE][i]] = cube[face][side[L_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[L_SIDE][i]] = cube[face][side[D_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[D_SIDE][i]] = cube[face][side[R_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[R_SIDE][i]] = tmp[i];
}
cube_junc from, to;
from = junc[face][0];
for(int i=0; i<3; i++){
tmp[i] = cube[from.face][side[from.side][i]];
}
copySide(face, 3, 0);
copySide(face, 2, 3);
copySide(face, 1, 2);
to = junc[face][1];
for(int i=0; i<3; i++){
cube[to.face][side[to.side][i]] = tmp[i];
}
return;
}
void spinCcw(int face){ // 반시계방향(-)
char tmp[3];
for(int i=0; i<2; i++){
tmp[i] = cube[face][side[U_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[U_SIDE][i]] = cube[face][side[R_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[R_SIDE][i]] = cube[face][side[D_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[D_SIDE][i]] = cube[face][side[L_SIDE][i]];
}
for(int i=0; i<2; i++){
cube[face][side[L_SIDE][i]] = tmp[i];
}
cube_junc from, to;
from = from = junc[face][0];
for(int i=0; i<3; i++){
tmp[i] = cube[from.face][side[from.side][i]];
}
copySide(face, 1, 0);
copySide(face, 2, 1);
copySide(face, 3, 2);
to = junc[face][3];
for(int i=0; i<3; i++){
cube[to.face][side[to.side][i]] = tmp[i];
}
return;
}
void solve(){
for(int i=0; i<n; i++){
if(comm[i][1] == '+') spinCw(faceNum[comm[i][0]]);
else spinCcw(faceNum[comm[i][0]]);
}
return;
}
void initCube(){
for(int i=0; i<9; i++){
cube[U][i] = 'w';
cube[D][i] = 'y';
cube[F][i] = 'r';
cube[B][i] = 'o';
cube[L][i] = 'g';
cube[R][i] = 'b';
}
return;
}
int main(){
faceNum['U'] = U;
faceNum['D'] = D;
faceNum['F'] = F;
faceNum['B'] = B;
faceNum['L'] = L;
faceNum['R'] = R;
int T;
cin >> T;
for(int test_case=1; test_case<=T; test_case++){
initCube();
cin >> n;
for(int i=0; i<n; i++) cin >> comm[i];
solve();
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
cout << cube[U][i * 3 + j];
}
cout << '\n';
}
}
return 0;
}
'알고리즘, 코딩테스트' 카테고리의 다른 글
백준 20057번(마법사 상어와 토네이도) c++ 풀이 (0) | 2025.03.28 |
---|---|
백준 13460번(구슬 탈출 2) c++ 풀이 (0) | 2025.03.28 |
백준 9184번(신나는 함수 실행) c++ 풀이 (0) | 2025.03.23 |
백준 12100번(2048 (Easy)) c++ 풀이 (1) | 2025.03.19 |
백준 14500번(테트로미노) c++ 풀이 (0) | 2025.03.19 |