Skip to content

Commit 7a4bfc1

Browse files
committed
40주차
1 parent 2c96186 commit 7a4bfc1

File tree

3 files changed

+569
-0
lines changed

3 files changed

+569
-0
lines changed
Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,383 @@
1+
package org.example._40week;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
7+
public class Cubing {
8+
9+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
private static final int TOP = 0;
11+
private static final int BOTTOM = 1;
12+
private static final int FRONT = 2;
13+
private static final int BACK = 3;
14+
private static final int LEFT = 4;
15+
private static final int RIGHT = 5;
16+
17+
private static final int WHITE = 0;
18+
private static final int YELLOW = 1;
19+
private static final int RED = 2;
20+
private static final int ORANGE = 3;
21+
private static final int GREEN = 4;
22+
private static final int BLUE = 5;
23+
private static final StringBuilder sb = new StringBuilder();
24+
25+
public static void main(String[] args) throws IOException {
26+
int testCaseCount = Integer.parseInt(br.readLine());
27+
// System.out.println();
28+
for (int test = 0; test < testCaseCount; test++) {
29+
Cube cube = new Cube();
30+
31+
// System.out.println("초기 상태");
32+
// cube.debug(cube.cells);
33+
34+
int rollingCount = Integer.parseInt(br.readLine());
35+
String[] operations = br.readLine().split(" ");
36+
37+
for (int roll = 0; roll < rollingCount; roll++) {
38+
cube.roll(operations[roll]);
39+
}
40+
41+
// System.out.println("돌린 후");
42+
// cube.debug(cube.cells);
43+
cube.print();
44+
}
45+
46+
System.out.println(sb.toString());
47+
}
48+
49+
private static class Cube {
50+
int[][][] cells;
51+
52+
public Cube() {
53+
cells = new int[6][3][3];
54+
fill(TOP, WHITE);
55+
fill(BOTTOM, YELLOW);
56+
fill(FRONT, RED);
57+
fill(BACK, ORANGE);
58+
fill(LEFT, GREEN);
59+
fill(RIGHT, BLUE);
60+
}
61+
62+
private void fill(int sideNo, int color) {
63+
for (int row = 0; row < 3; row++) {
64+
for (int col = 0; col < 3; col++) {
65+
cells[sideNo][row][col] = color;
66+
}
67+
}
68+
}
69+
70+
public void roll(String operation) {
71+
int side = convertToSide(operation.charAt(0));
72+
char direction = operation.charAt(1);
73+
74+
int[][][] temp = cloneArray();
75+
76+
lookSideToTop(temp, side);
77+
System.out.println("바라보는 방향을 바꿔봐요");
78+
debug(temp);
79+
80+
roll(temp, direction);
81+
System.out.println("실제로 돌린 후");
82+
debug(temp);
83+
84+
lookTopToSide(temp, side);
85+
86+
System.out.println("다시 윗면이 위로오도록 수정후");
87+
debug(cells);
88+
}
89+
90+
private void lookTopToSide(int[][][] cells, int side) {
91+
switch (side) {
92+
case TOP:
93+
break;
94+
case BOTTOM:
95+
lookSideToTop(cells, BOTTOM);
96+
break;
97+
case FRONT:
98+
lookSideToTop(cells, BACK);
99+
break;
100+
case BACK:
101+
lookSideToTop(cells, FRONT);
102+
break;
103+
case LEFT:
104+
lookSideToTop(cells, RIGHT);
105+
break;
106+
case RIGHT:
107+
lookSideToTop(cells, LEFT);
108+
break;
109+
}
110+
111+
this.cells = cells;
112+
}
113+
114+
private void lookSideToTop(int[][][] cells, int side) {
115+
int[][] top = cells[TOP];
116+
int temp = 0;
117+
118+
switch (side) {
119+
case TOP:
120+
break;
121+
case BOTTOM:
122+
int[][] front = cells[FRONT];
123+
cells[TOP] = cells[BOTTOM];
124+
cells[BOTTOM] = top;
125+
cells[FRONT] = cells[BACK];
126+
cells[BACK] = front;
127+
128+
clockWise2Division(cells, LEFT, 2);
129+
counterClockWise2Division(cells, RIGHT, 2);
130+
break;
131+
case FRONT:
132+
cells[TOP] = cells[FRONT];
133+
cells[FRONT] = cells[BOTTOM];
134+
cells[BOTTOM] = cells[BACK];
135+
cells[BACK] = top;
136+
137+
clockWise2Division(cells, RIGHT, 1);
138+
counterClockWise2Division(cells, LEFT, 1);
139+
break;
140+
case BACK:
141+
cells[TOP] = cells[BACK];
142+
cells[BACK] = cells[BOTTOM];
143+
cells[BOTTOM] = cells[FRONT];
144+
cells[FRONT] = top;
145+
146+
clockWise2Division(cells, LEFT, 1);
147+
counterClockWise2Division(cells, RIGHT, 1);
148+
break;
149+
case LEFT:
150+
cells[TOP] = cells[LEFT];
151+
cells[LEFT] = cells[BOTTOM];
152+
cells[BOTTOM] = cells[RIGHT];
153+
cells[RIGHT] = top;
154+
155+
counterClockWise2Division(cells, BACK, 1);
156+
clockWise2Division(cells, FRONT, 1);
157+
158+
break;
159+
case RIGHT:
160+
cells[TOP] = cells[RIGHT];
161+
cells[RIGHT] = cells[BOTTOM];
162+
cells[BOTTOM] = cells[LEFT];
163+
cells[LEFT] = top;
164+
165+
counterClockWise2Division(cells, FRONT, 1);
166+
clockWise2Division(cells, BACK, 1);
167+
break;
168+
}
169+
}
170+
171+
private void counterClockWise2Division(int[][][] cells, int side, int count) {
172+
for (int i = 0; i < count; i++) {
173+
int[][] temp = new int[3][3];
174+
temp[0][0] = cells[side][0][2];
175+
temp[0][1] = cells[side][1][2];
176+
temp[0][2] = cells[side][2][2];
177+
temp[1][0] = cells[side][0][1];
178+
temp[1][1] = cells[side][1][1];
179+
temp[1][2] = cells[side][2][1];
180+
temp[2][0] = cells[side][0][0];
181+
temp[2][1] = cells[side][1][0];
182+
temp[2][2] = cells[side][2][0];
183+
184+
cells[side] = temp;
185+
}
186+
}
187+
188+
private static void clockWise2Division(int[][][] cells, int side, int count) {
189+
for (int i = 0; i < count; i++) {
190+
int[][] temp = new int[3][3];
191+
temp[0][0] = cells[side][2][0];
192+
temp[0][1] = cells[side][1][0];
193+
temp[0][2] = cells[side][0][0];
194+
195+
temp[1][0] = cells[side][2][1];
196+
temp[1][1] = cells[side][1][1];
197+
temp[1][2] = cells[side][0][1];
198+
199+
temp[2][0] = cells[side][2][2];
200+
temp[2][1] = cells[side][1][2];
201+
temp[2][2] = cells[side][0][2];
202+
203+
cells[side] = temp;
204+
}
205+
}
206+
207+
private int convertToSide(char ch) {
208+
switch (ch) {
209+
case 'U':
210+
return TOP;
211+
case 'D':
212+
return BOTTOM;
213+
case 'F':
214+
return FRONT;
215+
case 'B':
216+
return BACK;
217+
case 'L':
218+
return LEFT;
219+
case 'R':
220+
return RIGHT;
221+
}
222+
223+
return -1;
224+
}
225+
226+
227+
private int[][][] cloneArray() {
228+
int[][][] temp = new int[6][3][3];
229+
230+
for (int side = 0; side < 6; side++) {
231+
for (int row = 0; row < 3; row++) {
232+
for (int col = 0; col < 3; col++) {
233+
temp[side][row][col] = this.cells[side][row][col];
234+
}
235+
}
236+
}
237+
238+
return temp;
239+
}
240+
241+
private void roll(int[][][] cells, char direction) {
242+
if (direction == '+') {
243+
clockWise(cells);
244+
} else {
245+
counterClockWise(cells);
246+
}
247+
}
248+
249+
private void counterClockWise(int[][][] cells) {
250+
counterClockWise2Division(cells, TOP, 1);
251+
252+
int[] temp = new int[3];
253+
temp[0] = cells[FRONT][0][0];
254+
temp[1] = cells[FRONT][0][1];
255+
temp[2] = cells[FRONT][0][2];
256+
257+
cells[FRONT][0][0] = cells[LEFT][0][2];
258+
cells[FRONT][0][1] = cells[LEFT][1][2];
259+
cells[FRONT][0][2] = cells[LEFT][2][2];
260+
261+
cells[LEFT][0][2] = cells[BACK][2][2];
262+
cells[LEFT][1][2] = cells[BACK][2][1];
263+
cells[LEFT][2][2] = cells[BACK][2][0];
264+
265+
cells[BACK][2][0] = cells[RIGHT][0][0];
266+
cells[BACK][2][1] = cells[RIGHT][1][0];
267+
cells[BACK][2][2] = cells[RIGHT][2][0];
268+
269+
cells[RIGHT][0][0] = temp[2];
270+
cells[RIGHT][1][0] = temp[1];
271+
cells[RIGHT][2][0] = temp[0];
272+
}
273+
274+
private void clockWise(int[][][] cells) {
275+
int[] temp = new int[3];
276+
clockWise2Division(cells, TOP, 1);
277+
278+
temp[0] = cells[FRONT][0][0];
279+
temp[1] = cells[FRONT][0][1];
280+
temp[2] = cells[FRONT][0][2];
281+
282+
cells[FRONT][0][0] = cells[RIGHT][2][0];
283+
cells[FRONT][0][1] = cells[RIGHT][1][0];
284+
cells[FRONT][0][2] = cells[RIGHT][0][0];
285+
286+
cells[RIGHT][0][0] = cells[BACK][2][0];
287+
cells[RIGHT][1][0] = cells[BACK][2][1];
288+
cells[RIGHT][2][0] = cells[BACK][2][2];
289+
290+
cells[BACK][2][0] = cells[LEFT][2][2];
291+
cells[BACK][2][1] = cells[LEFT][1][2];
292+
cells[BACK][2][2] = cells[LEFT][0][2];
293+
294+
cells[LEFT][0][2] = temp[0];
295+
cells[LEFT][1][2] = temp[1];
296+
cells[LEFT][2][2] = temp[2];
297+
}
298+
299+
public void print() {
300+
for (int row = 0; row < 3; row++) {
301+
for (int col = 0; col < 3; col++) {
302+
print(cells[TOP][row][col]);
303+
}
304+
sb.append("\n");
305+
}
306+
}
307+
308+
private void print(int color) {
309+
switch (color) {
310+
case WHITE:
311+
sb.append("w");
312+
break;
313+
case YELLOW:
314+
sb.append("y");
315+
break;
316+
case RED:
317+
sb.append("r");
318+
break;
319+
case ORANGE:
320+
sb.append("o");
321+
break;
322+
case GREEN:
323+
sb.append("g");
324+
break;
325+
case BLUE:
326+
sb.append("b");
327+
break;
328+
}
329+
}
330+
331+
public void debug(int[][][] cells) {
332+
int[][] top = cells[TOP];
333+
int[][] front = cells[FRONT];
334+
int[][] bottom = cells[BOTTOM];
335+
int[][] back = cells[BACK];
336+
int[][] left = cells[LEFT];
337+
int[][] right = cells[RIGHT];
338+
339+
System.out.println(convert(null) + convert(back[0]) + convert(null));
340+
System.out.println(convert(null) + convert(back[1]) + convert(null));
341+
System.out.println(convert(null) + convert(back[2]) + convert(null));
342+
343+
System.out.println(convert(left[0]) + convert(top[0]) + convert(right[0]));
344+
System.out.println(convert(left[1]) + convert(top[1]) + convert(right[1]));
345+
System.out.println(convert(left[2]) + convert(top[2]) + convert(right[2]));
346+
347+
System.out.println(convert(null) + convert(front[0]) + convert(null));
348+
System.out.println(convert(null) + convert(front[1]) + convert(null));
349+
System.out.println(convert(null) + convert(front[2]) + convert(null));
350+
351+
System.out.println(convert(null) + convert(bottom[0]) + convert(null));
352+
System.out.println(convert(null) + convert(bottom[1]) + convert(null));
353+
System.out.println(convert(null) + convert(bottom[2]) + convert(null));
354+
}
355+
356+
private String convert(int[] line) {
357+
if (line == null) {
358+
return " ";
359+
}
360+
361+
return " " + convertChar(line[0]) + " " + convertChar(line[1]) + " " + convertChar(line[2]) + " ";
362+
}
363+
364+
private String convertChar(int color) {
365+
switch (color) {
366+
case WHITE:
367+
return "w";
368+
case YELLOW:
369+
return "y";
370+
case RED:
371+
return "r";
372+
case ORANGE:
373+
return "o";
374+
case GREEN:
375+
return "g";
376+
case BLUE:
377+
return "b";
378+
}
379+
380+
return null;
381+
}
382+
}
383+
}

0 commit comments

Comments
 (0)