본문 바로가기

연습문제/JAVA

[백준 java] 10866 - 덱

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


 

덱을 사용하면 쉽게 구현가능한 문제. 

입력과 동시에 연산을 수행하고 출력한다. 주석 참고!

 

출력은 StringBuilder를 사용하여 출력하였다.

순서대로 System.out.print와 / StringBuilder 를 사용하여 출력한 결과물이다.

비교하면 약 두배의 속도가 차이난다.

SystemOut은 매번 String을 선언하고 (생성되는 String 주소값) 메모리를 쓰지만

StringBuilder는 하나의 주소값에서 연산을 수행한다.

 



// 덱
// https://www.acmicpc.net/problem/10866

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class B10866 {
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        StringTokenizer st;
        Deque<Integer> deque = new ArrayDeque<>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(),"_| ");
            String str = st.nextToken();

            // 입력이 들어올때
            if(Objects.equals(str, "push")){
                String sbStr = st.nextToken();
                int num = Integer.parseInt(st.nextToken());
                if(Objects.equals(sbStr, "front")){
                    // 덱의 첫번째에 삽입
                    deque.addFirst(num);
                }else{
                    // 마지막에 삽입
                    deque.addLast(num);
                }
            // 그 외에 문자가 들어올 때
            }else {
                // "_"으로 자른 첫 문자열이 pop일때
                // 뒤에 문자와 합쳐준다
                if (Objects.equals(str, "pop")) {
                    String sbStr = st.nextToken();
                    str += sbStr;
                }

                // switch case 를 통해 입력과 동시에
                switch (str) {
                    // 바로 위 if 문에서 합친 문자열 popfront 
                    case "popfront": {
                        if (deque.isEmpty()) {
                            //System.out.println(-1);
                            sb.append(-1).append("\n");
                            continue;
                        }
                        sb.append(deque.removeFirst()).append("\n");
                        break;
                    }
                    case "popback": {
                        if (deque.isEmpty()) {
                            sb.append(-1).append("\n");
                            continue;
                        }
                        sb.append(deque.removeLast()).append("\n");
                        break;
                    }
                    case "size": {
                        sb.append(deque.size()).append("\n");
                        break;
                    }
                    case "empty": {
                        if (deque.isEmpty()) {
                            sb.append(1).append("\n");
                        } else {
                            sb.append(0).append("\n");
                        }
                        break;
                    }
                    case "front": {
                        if (deque.isEmpty()) {
                            sb.append(-1).append("\n");
                            continue;
                        }
                        sb.append(deque.peekFirst()).append("\n");
                        break;
                    }
                    case "back": {
                        if (deque.isEmpty()) {
                            sb.append(-1).append("\n");
                            continue;
                        }
                        sb.append(deque.peekLast()).append("\n");
                        break;
                    }

                }
            }
        }

        System.out.println(sb);
    }
}

 

 

'연습문제 > JAVA' 카테고리의 다른 글

[백준 java] 7576 - 토마토  (0) 2022.09.05
[백준 java] 1874 - 스택 수열  (0) 2022.09.04
[java 백준] 1021 - 회전하는 큐  (0) 2022.09.03
[백준 java] 3425 - 고스텍  (0) 2022.09.02
[백준 java] 1654 - 랜선자르기  (0) 2022.08.30