2021 마스터즈 코스 테스트 - 루빅스 큐브 구현하기 (1)

Jane·2020년 12월 16일
3
post-thumbnail

1단계: 단어 밀어내기

문제 설명

  1. 입력: 사용자로부터 단어 하나, 정수 숫자 하나( -100 <= N < 100) , L 또는 R을 입력받는다. L 또는 R은 대소문자 모두 입력 가능하다.
  2. 주어진 단어를 L이면 주어진 숫자 갯수만큼 왼쪽으로, R이면 오른쪽으로 밀어낸다.
  3. 밀려나간 단어는 반대쪽으로 채워진다.

👉 상세 문제 조건 및 구현 코드 확인


구조

입력값을 받아오고 프로그램을 실행시키기 위한 Main class와 단어를 밀어내기 위한 PushWords class를 구현했다.

Main 클래스

  1. PROMPT를 final 변수로 선언한다.
private static final String PROMPT = "> ";
  1. Scanner를 사용해서 사용자가 입력한 값을 받아온다.
Scanner sc = new Scanner(System.in);
System.out.print(PROMPT);
  1. 단어(word), 주어진 숫자(n), 이동 방향(direction)을 각각 다른 변수에 저장한 뒤 스캐너를 닫아준다.
String word = sc.next();
int n = sc.nextInt();
String direction = sc.next().toLowerCase();
sc.close();
  1. PushWords 인스턴스를 생성한 뒤, isLeft가 true라면 pushLeft메서드를 실행하고, false라면 pushRight 메서드를 실행한다.
PushWords pw = new PushWords(word);

if (pw.isLeft(n, direction)) pw.pushLeft(n);
else pw.pushRight(n);
  1. 결과값을 출력한다.
pw.printWord(pw.deque);

PushWords 클래스

  1. 단어 밀어내기 구현을 위한 deque을 선언한다.
Deque<Character> deque;
  1. word를 인자로 받고, word 문자열의 각 글자를 deque에 집어넣는 생성자를 정의한다.
    public PushWords(String word) {
        deque = new ArrayDeque<>();
        for (int i = 0; i < word.length(); i++) {
            deque.addLast(word.charAt(i));
        }
    }
  1. 단어 밀어내기 구현에 필요한 메서드를 정의한다.
메서드기능
isLeft(n, direction)이동 방향 확인, 왼쪽으로 밀어야 되면 true, 아니면 false를 반환
pushLeft(n)단어를 n의 절댓값만큼 왼쪽으로 밀기
pushRight(n)단어를 n의 절댓값만큼 오른쪽으로 밀기
printWord(deque)단어 출력

isLeft 메서드 : 이동 방향 확인, 왼쪽으로 밀어야 되면 true, 아니면 false를 반환

n이 양수 일 때는 입력한 문자대로, 음수일 때는 반대 방향으로 push된다는 점을 고려하여 코드를 설계하였다.

    boolean isLeft(int n, String direction) {
        if ((n > 0 && direction.equals("l")) || (n < 0 && direction.equals("r")))
            return true;
        return false;
    }

pushLeft 메서드 : 단어를 n의 절댓값만큼 왼쪽으로 밀기

n이 음수인 경우를 고려하여, 이동 횟수를 저장하는 변수(numOfMovements)에 n의 절댓값을 저장하였다. deque의 첫 번째 원소를 꺼내어 마지막에 삽입하는 작업을 이동 횟수만큼 반복하면, 주어진 숫자 갯수만큼 단어를 밀어내고 밀려나간 단어를 반대쪽에 채울 수 있다.

    void pushLeft(int n) {
        int numOfMovements = Math.abs(n);
        for (int i = 0; i < numOfMovements; i++) {
            deque.addLast(deque.removeFirst());
        }
    }

pushRight 메서드 : 단어를 n의 절댓값만큼 오른쪽으로 밀기

pushLeft와 같은 방법으로 구현할 수 있다. 이 경우에는 deque의 마지막 원소를 꺼내어 deque의 첫 번째 원소로 삽입해주면 된다.

    void pushRight(int n) {
        int numOfMovements = Math.abs(n);
        for (int i = 0; i < numOfMovements; i++) {
            deque.addFirst(deque.removeLast());
        }
    }

printWord 메서드 : 단어 출력

pushLeft 또는 pushRight 메서드를 실행 한 뒤, deque를 순회하며 요소들을 출력하면 결과값을 얻을 수 있다.

    void printWord(Deque<Character> deque) {
        for (char x : deque) {
            System.out.print(x);
        }
    }

영상 출처

3개의 댓글

comment-user-thumbnail
2021년 5월 20일

루빅스큐브 문제는 스위프트를 어느정도 알면 풀수 있나요?
아니면 스위프트 말고 다른 지식도 있어야 풀수 있나요?

2개의 답글