SW Expert Academy - 1228번(암호문1)

최지홍·2022년 2월 8일
0

SW Expert Academy

목록 보기
10/36

문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14w-rKAHACFAYD&categoryId=AV14w-rKAHACFAYD&categoryType=CODE&problemTitle=%EC%95%94%ED%98%B8%EB%AC%B8&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;

public class Solution {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; i < 10; i++) {
            int originalLength = Integer.parseInt(reader.readLine()); // 원본 암호문 길이
            StringTokenizer tokenizer = new StringTokenizer(reader.readLine()); // 원본 암호문
            ArrayDeque<String> deque = new ArrayDeque<>();
            while (tokenizer.hasMoreTokens()) {
                deque.offer(tokenizer.nextToken());
            }
            int commandLength = Integer.parseInt(reader.readLine()); // 명령어의 개수
            tokenizer = new StringTokenizer(reader.readLine()); // 명령어
            Queue<String> queue = new ArrayDeque<>();
            while (tokenizer.hasMoreTokens()) {
                queue.offer(tokenizer.nextToken());
            }

            deque = process(deque, queue);
            sb.append("#").append(i + 1).append(" ");
            for (int j = 0; j < 10; j++) {
                sb.append(deque.poll()).append(" ");
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }

    private static ArrayDeque process(ArrayDeque<String> origin, Queue<String> command) {
        while (!command.isEmpty()) {
            if (command.poll().equals("I")) {
                int index = Integer.parseInt(command.poll()); // 인덱스
                int count = Integer.parseInt(command.poll()); // 개수
                Stack<String> temp = new Stack<>(); // 임시 저장 스택
                for (int i = 0; i < index; i++) { // 저장할 위치까지 뺌
                    temp.push(origin.poll());
                }

                for (int i = 0; i < count; i++) {
                    temp.push(command.poll()); // 임시 저장 스택에다가 저장해둠
                }

                while (!temp.isEmpty()) { // 다시 붙이기
                    origin.offerFirst(temp.pop());
                }
            }
        }

        return origin;
    }

}

  • 새로 알게된 deque를 통해 구현해 보았다. queue 만으로도 구현이 가능하나, 구현의 편리를 위해 deque를 사용하였다.
  • 명령문에서 주어진 수만큼 기존 deque에서 앞부분을 poll() 하여 임시 저장 스택에 저장한 후, 명령문에서 두 번째로 주어진 수 만큼 명령문에서 코드를 poll() 하여 임시 저장 스택에 push() 한다.
  • 그 후, 다시 원본 deque 앞부분에 스택의 모든 내용을 pop() 하여 offerFirst() 한다.
profile
백엔드 개발자가 되자!

0개의 댓글