πŸ“ 문제 μ„€λͺ…

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 덱을 κ΅¬ν˜„ν•˜κ³ , λ±μ—μ„œ μ‚¬μš© λ˜λŠ” 8κ°€μ§€ μ»€λ§¨λ“œλ₯Ό κ΅¬ν˜„ν•˜λΌ.

  1. push_front X: μ •μˆ˜ Xλ₯Ό 덱의 μ•žμ— λ„£λŠ”λ‹€.
  2. push_back X: μ •μˆ˜ Xλ₯Ό 덱의 뒀에 λ„£λŠ”λ‹€.
  3. pop_front: 덱의 κ°€μž₯ μ•žμ— μžˆλŠ” 수λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½, 덱에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  4. pop_back: 덱의 κ°€μž₯ 뒀에 μžˆλŠ” 수λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½, 덱에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  5. size: 덱에 λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  6. empty: 덱이 λΉ„μ–΄μžˆμœΌλ©΄ 1을, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  7. front: 덱의 κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 덱에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  8. back: 덱의 κ°€μž₯ 뒀에 μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 덱에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

문제 링크


πŸ’‘ 아이디어

  • μžλ°” 곡식 λ¬Έμ„œμ˜ ꢌμž₯에 따라 ArrayDeque을 μ‚¬μš©ν•˜μ—¬ 덱을 κ΅¬ν˜„ν•œλ‹€. 곡식 λ¬Έμ„œ
  • if - else둜 μ˜ˆμ™Έ 처리λ₯Ό 해두긴 ν–ˆμ§€λ§Œ, 더 μ•ˆμ •μ μΈ ν•¨μˆ˜μΈ .poll.peek을 μ‚¬μš©ν•˜μ—¬ μ»€λ§¨λ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.

πŸ›  μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

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

        Deque<Integer> deque = new ArrayDeque<>();

        while (N-- > 0) {
            String command = br.readLine();

            // [1] push_front
            if (command.startsWith("push_front")) {
                int X = Integer.parseInt(command.split(" ")[1]);
                deque.addFirst(X); // 덱 μ•žμ— μ‚½μž…

                // [2] push_back
            } else if (command.startsWith("push_back")) {
                int X = Integer.parseInt(command.split(" ")[1]);
                deque.addLast(X); // 덱 뒀에 μ‚½μž…

                // [3] pop_front
            } else if (command.equals("pop_front")) {
                if (!deque.isEmpty()) {
                    System.out.println(deque.pollFirst());
                } else {
                    System.out.println(-1);
                }

                // [4] pop_back
            } else if (command.equals("pop_back")) {
                if (!deque.isEmpty()) {
                    System.out.println(deque.pollLast());
                } else {
                    System.out.println(-1);
                }

                // [5] size
            } else if (command.equals("size")) {
                System.out.println(deque.size());

                // [6] empty
            } else if (command.equals("empty")) {
                System.out.println((deque.isEmpty()) ? 1 : 0);

                // [7] front
            } else if (command.equals("front")) {
                if (!deque.isEmpty()) {
                    System.out.println(deque.peekFirst());
                } else {
                    System.out.println(-1);
                }

                // [8] back
            } else if (command.equals("back")) {
                if (!deque.isEmpty()) {
                    System.out.println(deque.peekLast());
                } else {
                    System.out.println(-1);
                }
            }
        }
    }
}

⏱ μ‹œκ°„λ³΅μž‘λ„

총 μ»€λ§¨λ“œμ˜ 수λ₯Ό N이라 ν•  λ•Œ, 각 λͺ…λ Ήμ–΄λŠ” ArrayDeque의 λ©”μ„œλ“œ (addFirst, pollLast, peekFirst λ“±)λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 각 연산은 O(1) μ‹œκ°„μ— μˆ˜ν–‰λœλ‹€.
λ”°λΌμ„œ 전체 μ»€λ§¨λ“œμ— λŒ€ν•œ 총 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N) 이닀.


✏️ λŠλ‚€ 점

  • μŠ€νƒ, 큐, 덱을 κ΅¬ν˜„ν•˜λŠ” 기초 3문제λ₯Ό μ „λΆ€ ν’€μ—ˆλŠ”λ°, λ§Žμ€ 도움이 된 것 κ°™λ‹€.
  • μœ μ‚¬ λ¬Έμ œλŠ” 슀슀둜 λ°œμƒμ΄ κ°€λŠ₯ν•΄μ‘Œλ‹€.