[알고리즘] 백준 5373
문제
3x3x3으로 된 큐브를 돌리는 삼성 기출 문제였다.
다음과 같이 12x9로 큐브를 표현하고 각각 돌릴때마다 행렬값을 움직여줬다.
구현 자체가 특별한 규칙보다는 각 상황에 맞게 for문과 if문을 반복 사용해줘서 코드가 굉장히 복잡하고 이쁘지도 않다.
구현 자체 시간도 오래 걸렸는데 마지막에 2군데에서 고비를 겪었다.
1. 내 주변만 돌려주는것이 아니라 내 면도 돌려야한다.
L을 돌리면 B,U,F,D만 돌리는게 아니라 L도 같이 돌려줘야했던걸 마지막에 알았다.
2. 명령문이 'L+'처럼 2개의 문자로 되어있는데 \0처럼 개행문자도 생각해줘야하기 때문에 문자열의 크기를 3으로 했어야했다.
이것때문에 디버깅만 몇시간을...
코드 자체가 굉장히 복잡해질수가 있어서 숫자로 구현해서 편하게 디버깅해보고 나중에 문자로 치환하는게 나을뻔했다.
code
/**
* 백준 5373
* 퍼즐
* U,D,F,B,L,R
* +:시계, -:반시계
*/
#include <bits/stdc++.h>
using namespace std;
char cube[12][9];
int numCube[12][9];
void initCube(){
int i,j;
// U,흰
for(i=3;i<3*2;i++){
for(j=3;j<3*2;j++) cube[i][j]='w';
}
// B,오
for(i=0;i<3;i++){
for(j=3;j<3*2;j++) cube[i][j]='o';
}
// L,초
for(i=3;i<3*2;i++){
for(j=0;j<3;j++) cube[i][j]='g';
}
// R,파
for(i=3;i<3*2;i++){
for(j=3*2;j<3*3;j++) cube[i][j]='b';
}
// F,빨
for(i=3*2;i<3*3;i++){
for(j=3;j<3*2;j++) cube[i][j]='r';
}
// D,노
for(i=3*3;i<3*4;i++){
for(j=3;j<3*2;j++) cube[i][j]='y';
}
}
void rotateSide(int sy,int sx,int ey,int ex,char way){
char tmp[8];
int idx=0;
if(way=='+'){
for(int i=ey;i>=sy;i--) tmp[idx++]=cube[i][sx];
for(int j=sx+1;j<=ex;j++) tmp[idx++]=cube[sy][j];
for(int i=sy+1;i<=ey;i++) tmp[idx++]=cube[i][ex];
for(int j=ex-1;j>sx;j--) tmp[idx++]=cube[ey][j];
}
else{
for(int i=sy;i<=ey;i++) tmp[idx++]=cube[i][ex];
for(int j=ex-1;j>=sx;j--) tmp[idx++]=cube[ey][j];
for(int i=ey-1;i>=sy;i--) tmp[idx++]=cube[i][sx];
for(int j=sx+1;j<ex;j++) tmp[idx++]=cube[sy][j];
}
idx=0;
for(int j=sx;j<=ex;j++) cube[sy][j]=tmp[idx++];
for(int i=sy+1;i<=ey;i++) cube[i][ex]=tmp[idx++];
for(int j=ex-1;j>=sx;j--) cube[ey][j]=tmp[idx++];
for(int i=ey-1;i>sy;i--) cube[i][sx]=tmp[idx++];
}
void move(char* comds){
char side=comds[0];
char way=comds[1];
char tmp[12];
// L
if(side=='L'){
if(way=='+'){
for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3];
rotateSide(3,0,5,2,'+');
}
else{
for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3];
rotateSide(3,0,5,2,'-');
}
for(int i=0;i<3*4;i++) cube[i][3]=tmp[i];
}
else if(side=='R'){
if(way=='+'){
for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3*2-1];
rotateSide(3,6,5,8,'+');
}
else{
for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3*2-1];
rotateSide(3,6,5,8,'-');
}
for(int i=0;i<3*4;i++) cube[i][3*2-1]=tmp[i];
}
else if(side=='B'){
if(way=='+'){
// 0~5
for(int j=3;j<3*3;j++) tmp[j-3]=cube[3][j];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*4-1][j];
// 9~11
for(int j=0;j<3;j++) tmp[j+9]=cube[3][j];
rotateSide(0,3,2,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*4-1][j];
// 3~8
for(int j=0;j<3*2;j++) tmp[j+3]=cube[3][j];
// 9~11
for(int j=3*2;j<3*3;j++) tmp[j+3]=cube[3][j];
rotateSide(0,3,2,5,'-');
}
for(int i=0;i<3*3;i++) cube[3][i]=tmp[i];
for(int i=9;i<12;i++) cube[3*4-1][14-i]=tmp[i];
}
else if(side=='F'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*3][j];
// 3~11
for(int j=0;j<3*3;j++) tmp[j+3]=cube[3*2-1][j];
rotateSide(6,3,8,5,'+');
}
else{
// 0~5
for(int j=3;j<3*3;j++) tmp[j-3]=cube[3*2-1][j];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*3][j];
// 9~11
for(int j=0;j<3;j++) tmp[j+9]=cube[3*2-1][j];
rotateSide(6,3,8,5,'-');
}
for(int i=0;i<9;i++) cube[3*2-1][i]=tmp[i];
for(int i=9;i<12;i++) cube[3*3][14-i]=tmp[i];
}
else if(side=='U'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*2][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3-1];
// 6~8
for(int j=3;j<3*2;j++) tmp[j+3]=cube[3-1][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][3*2];
rotateSide(3,3,5,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[j-3]=cube[3-1][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[i]=cube[i][3*2];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*2][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3-1];
rotateSide(3,3,5,5,'-');
}
for(int i=0;i<3;i++) cube[5-i][3-1]=tmp[i];
for(int i=3;i<6;i++) cube[3-1][i]=tmp[i];
for(int i=6;i<9;i++) cube[i-3][3*2]=tmp[i];
for(int i=9;i<12;i++) cube[3*2][14-i]=tmp[i];
}
else if(side=='D'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[0][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[i]=cube[i][0];
// 6~8
for(int j=3;j<3*2;j++) tmp[j+3]=cube[3*3-1][j];;
// 9~11
for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3*3-1];
rotateSide(9,3,11,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[j-3]=cube[3*3-1][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3*3-1];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[0][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][0];
rotateSide(9,3,11,5,'-');
}
for(int i=0;i<3;i++) cube[i+3][0]=tmp[i];
for(int i=3;i<6;i++) cube[3*3-1][i]=tmp[i];
for(int i=6;i<9;i++) cube[11-i][9-1]=tmp[i];
for(int i=9;i<12;i++) cube[0][14-i]=tmp[i];
}
}
void printUp(){
for(int i=3;i<3*2;i++){
for(int j=3;j<3*2;j++){
printf("%c",cube[i][j]);
}
printf("\n");
}
}
int main(void){
int tc,num;
cin>>tc;
while(tc--){
initCube();
cin>>num;
char comds[3];
while(num--){
scanf("%s",comds);
move(comds);
}
printUp();
}
}
Author And Source
이 문제에 관하여([알고리즘] 백준 5373), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@shininghyunho/알고리즘-백준-5373
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/**
* 백준 5373
* 퍼즐
* U,D,F,B,L,R
* +:시계, -:반시계
*/
#include <bits/stdc++.h>
using namespace std;
char cube[12][9];
int numCube[12][9];
void initCube(){
int i,j;
// U,흰
for(i=3;i<3*2;i++){
for(j=3;j<3*2;j++) cube[i][j]='w';
}
// B,오
for(i=0;i<3;i++){
for(j=3;j<3*2;j++) cube[i][j]='o';
}
// L,초
for(i=3;i<3*2;i++){
for(j=0;j<3;j++) cube[i][j]='g';
}
// R,파
for(i=3;i<3*2;i++){
for(j=3*2;j<3*3;j++) cube[i][j]='b';
}
// F,빨
for(i=3*2;i<3*3;i++){
for(j=3;j<3*2;j++) cube[i][j]='r';
}
// D,노
for(i=3*3;i<3*4;i++){
for(j=3;j<3*2;j++) cube[i][j]='y';
}
}
void rotateSide(int sy,int sx,int ey,int ex,char way){
char tmp[8];
int idx=0;
if(way=='+'){
for(int i=ey;i>=sy;i--) tmp[idx++]=cube[i][sx];
for(int j=sx+1;j<=ex;j++) tmp[idx++]=cube[sy][j];
for(int i=sy+1;i<=ey;i++) tmp[idx++]=cube[i][ex];
for(int j=ex-1;j>sx;j--) tmp[idx++]=cube[ey][j];
}
else{
for(int i=sy;i<=ey;i++) tmp[idx++]=cube[i][ex];
for(int j=ex-1;j>=sx;j--) tmp[idx++]=cube[ey][j];
for(int i=ey-1;i>=sy;i--) tmp[idx++]=cube[i][sx];
for(int j=sx+1;j<ex;j++) tmp[idx++]=cube[sy][j];
}
idx=0;
for(int j=sx;j<=ex;j++) cube[sy][j]=tmp[idx++];
for(int i=sy+1;i<=ey;i++) cube[i][ex]=tmp[idx++];
for(int j=ex-1;j>=sx;j--) cube[ey][j]=tmp[idx++];
for(int i=ey-1;i>sy;i--) cube[i][sx]=tmp[idx++];
}
void move(char* comds){
char side=comds[0];
char way=comds[1];
char tmp[12];
// L
if(side=='L'){
if(way=='+'){
for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3];
rotateSide(3,0,5,2,'+');
}
else{
for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3];
rotateSide(3,0,5,2,'-');
}
for(int i=0;i<3*4;i++) cube[i][3]=tmp[i];
}
else if(side=='R'){
if(way=='+'){
for(int i=0;i<3*4;i++) tmp[i]=cube[(i+3)%12][3*2-1];
rotateSide(3,6,5,8,'+');
}
else{
for(int i=0;i<3*4;i++) tmp[i]=cube[(i-3+12)%12][3*2-1];
rotateSide(3,6,5,8,'-');
}
for(int i=0;i<3*4;i++) cube[i][3*2-1]=tmp[i];
}
else if(side=='B'){
if(way=='+'){
// 0~5
for(int j=3;j<3*3;j++) tmp[j-3]=cube[3][j];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*4-1][j];
// 9~11
for(int j=0;j<3;j++) tmp[j+9]=cube[3][j];
rotateSide(0,3,2,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*4-1][j];
// 3~8
for(int j=0;j<3*2;j++) tmp[j+3]=cube[3][j];
// 9~11
for(int j=3*2;j<3*3;j++) tmp[j+3]=cube[3][j];
rotateSide(0,3,2,5,'-');
}
for(int i=0;i<3*3;i++) cube[3][i]=tmp[i];
for(int i=9;i<12;i++) cube[3*4-1][14-i]=tmp[i];
}
else if(side=='F'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*3][j];
// 3~11
for(int j=0;j<3*3;j++) tmp[j+3]=cube[3*2-1][j];
rotateSide(6,3,8,5,'+');
}
else{
// 0~5
for(int j=3;j<3*3;j++) tmp[j-3]=cube[3*2-1][j];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*3][j];
// 9~11
for(int j=0;j<3;j++) tmp[j+9]=cube[3*2-1][j];
rotateSide(6,3,8,5,'-');
}
for(int i=0;i<9;i++) cube[3*2-1][i]=tmp[i];
for(int i=9;i<12;i++) cube[3*3][14-i]=tmp[i];
}
else if(side=='U'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[3*2][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3-1];
// 6~8
for(int j=3;j<3*2;j++) tmp[j+3]=cube[3-1][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][3*2];
rotateSide(3,3,5,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[j-3]=cube[3-1][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[i]=cube[i][3*2];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[3*2][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3-1];
rotateSide(3,3,5,5,'-');
}
for(int i=0;i<3;i++) cube[5-i][3-1]=tmp[i];
for(int i=3;i<6;i++) cube[3-1][i]=tmp[i];
for(int i=6;i<9;i++) cube[i-3][3*2]=tmp[i];
for(int i=9;i<12;i++) cube[3*2][14-i]=tmp[i];
}
else if(side=='D'){
if(way=='+'){
// 0~2
for(int j=3;j<3*2;j++) tmp[5-j]=cube[0][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[i]=cube[i][0];
// 6~8
for(int j=3;j<3*2;j++) tmp[j+3]=cube[3*3-1][j];;
// 9~11
for(int i=3;i<3*2;i++) tmp[14-i]=cube[i][3*3-1];
rotateSide(9,3,11,5,'+');
}
else{
// 0~2
for(int j=3;j<3*2;j++) tmp[j-3]=cube[3*3-1][j];
// 3~5
for(int i=3;i<3*2;i++) tmp[8-i]=cube[i][3*3-1];
// 6~8
for(int j=3;j<3*2;j++) tmp[11-j]=cube[0][j];
// 9~11
for(int i=3;i<3*2;i++) tmp[i+6]=cube[i][0];
rotateSide(9,3,11,5,'-');
}
for(int i=0;i<3;i++) cube[i+3][0]=tmp[i];
for(int i=3;i<6;i++) cube[3*3-1][i]=tmp[i];
for(int i=6;i<9;i++) cube[11-i][9-1]=tmp[i];
for(int i=9;i<12;i++) cube[0][14-i]=tmp[i];
}
}
void printUp(){
for(int i=3;i<3*2;i++){
for(int j=3;j<3*2;j++){
printf("%c",cube[i][j]);
}
printf("\n");
}
}
int main(void){
int tc,num;
cin>>tc;
while(tc--){
initCube();
cin>>num;
char comds[3];
while(num--){
scanf("%s",comds);
move(comds);
}
printUp();
}
}
Author And Source
이 문제에 관하여([알고리즘] 백준 5373), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shininghyunho/알고리즘-백준-5373저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)