본문 바로가기

Problem/시뮬레이션

[C/C++] BOJ 5373 :: 큐빙

BOJ 5373 :: 큐빙




문제 링크 : https://www.acmicpc.net/problem/5373






아무리 생각해도 노가다 방법밖에 생각이 안나서 ㅠㅠ


그렇게 풀기 싫어가지구.. 백준님 푸는 방법을 보고 공부해서 직접 같은 방식으로 구현해 보았다!


문제를 보고 이렇게 푸는 방식을 생각하시다니.. 대단한 것 같다!! 그리고 개발환경 안쓰시고 문제 제출하는 창에 직접 코딩하심 ㄹㅇ...후덜덜ㅎ...



참고 링크 : https://www.youtube.com/watch?v=8XJcnUPIu_Q




나의 풀이




시계방향이동하는 것을 구현하면 반시계방향 이동하는 것을 구현할 필요가 없다!

시계방향으로 세 번 이동한 것이 반시계방향으로 한 번 이동한 것과 같기 때문!


이를 제외하고 남은 6가지 경우 U, D, F, B, L, R 도 모두 구현할 필요가 없다!

큐브를 굴린다면 두 가지 구현만으로도(코드에서는 L과 R) 모든 구현을 해낼 수 있다!



U : 큐브의 윗면을 오른쪽면으로 굴린 후, 좌표를 갱신해주는 함수

F : 큐브의 앞면을 왼쪽면으로 굴린 후, 좌표를 갱신해주는 함수

L : 왼쪽면 큐브를 돌린 후, 왼쪽면의 값도 바꿔주는 함수

R : 오른쪽면 큐브를 돌린 후, 오른쪽면의 값도 바꿔주는 함수



(각 큐브 면의 (0,0) 위치)




Ex) U-


if (str[1== '-') k = 3;
 
            if (str[0== 'U')
            {
                U(cube);
                for (int j = 0; j < k; j++) R(cube);
                for (int j = 0; j < 3; j++) U(cube);
            }


U함수로 큐브의 윗면을 오른쪽면으로 굴린 후, 좌표를 갱신한다.

R함수로 큐브의 오른쪽면을 시계방향으로 세 번 돌린다. (= 이는 반시계방향으로 한 번 돌린 것과 같다.)

U함수로 큐브의 윗면을 오른쪽면으로 세 번 굴린다. (= 아까 한 번 돌린 것과 합치면 총 4번이 되기 때문에 기존의 윗면이 있던 제자리로 돌아온다.)




나의 코드



Github : 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// 백준알고리즘 5373번 :: 큐빙
#include<iostream>
#include<vector>
#include<string>
using namespace std;
 
int T, n;
 
void clockwise(vector<vector<char>>&a)
{
    char temp = a[0][0];
    a[0][0= a[2][0];
    a[2][0= a[2][2];
    a[2][2= a[0][2];
    a[0][2= temp;
 
    temp = a[0][1];
    a[0][1= a[1][0];
    a[1][0= a[2][1];
    a[2][1= a[1][2];
    a[1][2= temp;
    return;
}
 
void U(vector<vector<vector<char>>>&a)
{
    vector<vector<char>> temp = a[5];
    a[5= a[0];
    a[0= a[4];
    a[4= a[1];
    a[1= temp;
 
    clockwise(a[1]); clockwise(a[1]);
    clockwise(a[4]); clockwise(a[4]);
    clockwise(a[2]);
    clockwise(a[3]); clockwise(a[3]); clockwise(a[3]);
    return;
}
 
void F(vector<vector<vector<char>>>&a)
{
    vector<vector<char>> temp = a[2];
    a[2= a[5];
    a[5= a[3];
    a[3= a[4];
    a[4= temp;
 
    clockwise(a[2]);
    clockwise(a[4]);
    clockwise(a[3]);
    clockwise(a[5]);
    clockwise(a[1]); clockwise(a[1]); clockwise(a[1]);
    clockwise(a[0]);
    return;
}
 
void L(vector<vector<vector<char>>>&a)
{
    // 0 -> 2 -> 1 -> 3
    vector<vector<char>> temp = a[0];
    for (int i = 0; i < 3; i++)
    {
        a[0][i][0= a[3][i][0];
        a[3][i][0= a[1][i][0];
        a[1][i][0= a[2][i][0];
        a[2][i][0= temp[i][0];
    }
    clockwise(a[4]);
    return;
}
void R(vector<vector<vector<char>>>&a)
{
    // 0 -> 3 -> 1 -> 2
    vector<vector<char>> temp = a[0];
    for (int i = 0; i < 3; i++)
    {
        a[0][i][2= a[2][i][2];
        a[2][i][2= a[1][i][2];
        a[1][i][2= a[3][i][2];
        a[3][i][2= temp[i][2];
    }
    clockwise(a[5]);
    return;
}
int main(void)
{
    cin >> T;
    string str;
 
    while (T--)
    {
        vector<vector<vector<char>>> cube;
        cube.push_back(vector<vector<char>>(3vector<char>(3'w')));
        cube.push_back(vector<vector<char>>(3vector<char>(3'y')));
        cube.push_back(vector<vector<char>>(3vector<char>(3'r')));
        cube.push_back(vector<vector<char>>(3vector<char>(3'o')));
        cube.push_back(vector<vector<char>>(3vector<char>(3'g')));
        cube.push_back(vector<vector<char>>(3vector<char>(3'b')));
 
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cin >> str;
            int k = 1;
            if (str[1== '-') k = 3;
 
            if (str[0== 'U')
            {
                U(cube);
                for (int j = 0; j < k; j++) R(cube);
                for (int j = 0; j < 3; j++) U(cube);
            }
            else if (str[0== 'D')
            {
                U(cube);
                for (int j = 0; j < k; j++) L(cube);
                for (int j = 0; j < 3; j++) U(cube);
            }
            else if (str[0== 'F')
            {
                F(cube);
                for (int j = 0; j < k; j++) L(cube);
                for (int j = 0; j < 3; j++) F(cube);
            }
            else if (str[0== 'B')
            {
                F(cube);
                for (int j = 0; j < k; j++) R(cube);
                for (int j = 0; j < 3; j++) F(cube);
            }
            else if (str[0== 'L')
            {
                for(int j = 0; j < k; j++) L(cube);
            }
            else if (str[0== 'R')
            {
                for (int j = 0; j < k; j++) R(cube);
            }
        }
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
                cout << cube[0][i][j];
            cout << '\n';
        }
    }
    return 0;
}
cs


'Problem > 시뮬레이션' 카테고리의 다른 글

[C/C++] BOJ 3048 :: 개미  (0) 2019.03.20
[C/C++] BOJ 16235 :: 나무 재테크  (0) 2019.03.04
[SW Expert Academy] 1210. Ladder1  (0) 2019.02.26
[C/C++] BOJ 1331 :: 나이트 투어  (0) 2019.02.08
[C/C++] BOJ 13901 :: 로봇  (0) 2019.02.07