3 X 3의 2차원 배열이 아래처럼 있다.
R R W
G C W
G B B
사용자 입력을 받아서 아래의 동작을 하는 프로그램을 구현하시오
> U 가장 윗줄을 왼쪽으로 한 칸 밀기 RRW -> RWR
> U' 가장 윗줄을 오른쪽으로 한 칸 밀기 RRW -> WRR
> R 가장 오른쪽 줄을 위로 한 칸 밀기 WWB -> WBW
> R' 가장 오른쪽 줄을 아래로 한 칸 밀기 WWB -> BWW
> L 가장 왼쪽 줄을 아래로 한 칸 밀기 RGG -> GRG (L의 경우 R과 방향이 반대임을 주의한다.)
> L' 가장 왼쪽 줄을 위로 한 칸 밀기 RGG -> GGR
> B 가장 아랫줄을 오른쪽으로 한 칸 밀기 GBB -> BGB (B의 경우도 U와 방향이 반대임을 주의한다.)
> B' 가장 아랫줄을 왼쪽으로 한 칸 밀기 GBB -> BBG
> Q Bye~를 출력하고 프로그램을 종료한다.
프롬프트를 실행하는 Main class와 Prompt 관련 메서드를 저장하는 Prompt class, 평면 큐브에 관련된 정보와 push 메서드들이 들어있는 FlatCube class를 구현했다.
Prompt 객체와 runPrompt() 메서드를 활용하여 Main 클래스는 단순하게 구현하였다.
Prompt p = new Prompt();
p.runPrompt();
메서드 | 기능 |
---|---|
getCommandKeyList(scanner) | 사용자로부터 입력받은 명령어를 저장하는 cmdQueue를 ArrayList의 형태로 반환 |
selectCommand(flatCube, cmdQueue) | cmdQueue의 명령어를 차례로 실행 |
runPrompt() | 간단한 프롬프트 출력 및 selectCommand 메서드 실행 |
getCommandKeyList 메서드 : 사용자로부터 입력받은 명령어를 저장하는 cmdQueue를 ArrayList의 형태로 반환
'
가 나온 경우 바로 전 순회 때 추가된 cmdKey에 '
를 추가해준 뒤 continue 문을 사용해서 다음 순회로 넘어간다. ArrayList<String> getCommandKeyList(Scanner sc) {
String cmd = sc.nextLine();
ArrayList<String> cmdQueue = new ArrayList<>();
int countSingleQuote = 0;
for (int i = 0; i < cmd.length(); i++) {
String cmdKey = Character.toString(cmd.charAt(i)).toUpperCase();
if (cmdKey.equals("'")) {
countSingleQuote++;
cmdQueue.set(i - countSingleQuote, cmdQueue.get(i - countSingleQuote) + "'");
continue;
}
cmdQueue.add(cmdKey);
}
return cmdQueue;
}
selectCommand 메서드 : cmdQueue의 명령어를 차례로 실행
void selectCommand(FlatCube cube, ArrayList<String> cmdQueue) {
for (String x : cmdQueue) {
if (x.equals("Q")) {
isLoop = false;
System.out.println("Bye~");
break;
}
System.out.println("\n" + x);
cube.pushCubeByCommands(x);
cube.printFlatCube();
}
}
runPrompt 메서드 : 간단한 프롬프트 출력 및 selectCommand 메서드 실행
isLoop=false
가 되기 전까지 간단한 프롬프트(CUBE> )를 출력하고, 입력받은 명령어를 실행할 수 있는 selectCommand 메서드를 호출한다. void runPrompt() {
FlatCube cube = new FlatCube();
cube.printFlatCube();
Scanner sc = new Scanner(System.in);
final String PROMPT = "CUBE> ";
while (isLoop) {
System.out.print("\n" + PROMPT);
selectCommand(cube, getCommandKeyList(sc));
}
sc.close();
}
Deque<String> cubeTop, cubeMiddle, cubeBottom;
public FlatCube() {
cubeTop = new ArrayDeque<>();
cubeMiddle = new ArrayDeque<>();
cubeBottom = new ArrayDeque<>();
String[][] cube = { { "R", "R", "W" }, { "G", "C", "W" }, { "G", "B", "B" } };
for (int i = 0; i < 3; i++) {
cubeTop.add(cube[0][i]);
cubeMiddle.add(cube[1][i]);
cubeBottom.add(cube[2][i]);
}
}
메서드 | 기능 |
---|---|
pushCubeByCommands(cmd) | 명령어 문자열에 따라 밀기 메서드를 실행 |
pushLeft(deque) | deque를 왼쪽으로 한 칸 밀기 |
pushRight(deque) | deque를 오른쪽으로 한 칸 밀기 |
pushLeftUp() | 가장 왼쪽 줄을 위로 한 칸 밀기 |
pushLeftDown() | 가장 왼쪽 줄을 아래로 한 칸 밀기 |
pushRightUp() | 가장 오른쪽 줄을 위로 한 칸 밀기 |
pushRightDown() | 가장 오른쪽 줄을 아래로 한 칸 밀기 |
pushCubeComponents(deque) | 입력받은 deque을 출력 |
printFlatCube() | 평면 큐브를 출력 |
pushCubeByCommands 메서드 : 명령어 문자열에 따라 밀기 메서드를 실행
if~else
문 또는 switch~case
문 사용을 피하기 위해 HashMap에 명령어 별 메서드를 저장하였다. void pushCubeByCommands(String cmd) {
Map<String, Runnable> commands = new HashMap<>();
commands.put("U", () -> pushLeft(cubeTop));
commands.put("U'", () -> pushRight(cubeTop));
commands.put("R", () -> pushRightUp());
commands.put("R'", () -> pushRightDown());
commands.put("L", () -> pushLeftDown());
commands.put("L'", () -> pushLeftUp());
commands.put("B", () -> pushRight(cubeBottom));
commands.put("B'", () -> pushLeft(cubeBottom));
commands.get(cmd).run();
}
pushLeft 메서드 : deque를 왼쪽으로 한 칸 밀기
pushRight 메서드 : deque를 오른쪽으로 한 칸 밀기
void pushLeft(Deque<String> deque) {
deque.addLast(deque.removeFirst());
}
void pushRight(Deque<String> deque) {
deque.addFirst(deque.removeLast());
}
pushLeftUp 메서드 : 가장 왼쪽 줄을 위로 한 칸 밀기
void pushLeftUp() {
String temp = cubeTop.removeFirst();
cubeTop.addFirst(cubeMiddle.removeFirst());
cubeMiddle.addFirst(cubeBottom.removeFirst());
cubeBottom.addFirst(temp);
}
pushCubeComponents 메서드 : 입력받은 deque을 출력
printFlatCube 메서드 : 평면 큐브를 출력
void printCubeComponents(Deque<String> deque) {
for (String x : deque) {
System.out.print(x + " ");
}
System.out.println();
}
void printFlatCube() {
printCubeComponents(cubeTop);
printCubeComponents(cubeMiddle);
printCubeComponents(cubeBottom);
}