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

μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 큐λ₯Ό κ΅¬ν˜„ν•˜κ³ , νμ—μ„œ μ‚¬μš© λ˜λŠ” 5κ°€μ§€ μ»€λ§¨λ“œλ₯Ό κ΅¬ν˜„ν•˜λΌ.

  1. push X: μ •μˆ˜ Xλ₯Ό 큐에 λ„£λŠ” 연산이닀.
  2. pop: νμ—μ„œ κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό λΉΌκ³ , κ·Έ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  3. size: 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.
  4. empty: 큐가 λΉ„μ–΄μžˆμœΌλ©΄ 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.
  5. front: 큐의 κ°€μž₯ μ•žμ— μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.
  6. back: 큐의 κ°€μž₯ 뒀에 μžˆλŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ 큐에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ—†λŠ” κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

문제 링크


πŸ’‘ 아이디어

  • 큐의 front와 back 연산을 μœ„ν•΄μ„œ (맨 μ•ž/λ’€ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” μ—°μ‚°) ArrayList보닀 μ‹œκ°„ λ³΅μž‘λ„λ©΄μ—μ„œ 효율적인 LinkedListλ₯Ό μ‚¬μš©ν–ˆλ‹€.
  • μŠ€νƒ λ¬Έμ œμ™€ λ™μΌν•˜κ²Œ 곡백이 ν¬ν•¨λ˜μ–΄μžˆλŠ” push X μ»€λ§¨λ“œμ—λŠ” startsWith("push")λ₯Ό μ‚¬μš©ν•˜κ³ , λ‚˜λ¨Έμ§€ λͺ…λ Ήμ–΄λŠ” equals()둜 μ •ν™•νžˆ λΉ„κ΅ν•˜λŠ” 방식을 μ‚¬μš©ν–ˆλ‹€.
  • 전체 λ°˜λ³΅λ¬Έμ— for λŒ€μ‹  while (N-- > 0)을 μ‚¬μš©ν•˜μ—¬ 가독성을 λ†’μ˜€λ‹€.

πŸ›  μ½”λ“œ

import java.io.*;
import java.util.*;

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());

        LinkedList<Integer> queue = new LinkedList<>();

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

            // [1] push
            if (command.startsWith("push")) {
                int X = Integer.parseInt(command.split(" ")[1]);
                queue.add(X);
                
                // [2] pop
            } else if (command.equals("pop")) {
                if (!queue.isEmpty()) {
                    System.out.println(queue.getFirst());
                    queue.removeFirst();
                } else {
                    System.out.println(-1);
                }

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

                // [4] empty
            } else if (command.equals("empty")) {
                System.out.println(queue.isEmpty() ? 1 : 0);
                
                // [5] front
            } else if (command.equals("front")) {
                if (!queue.isEmpty()) {
                    System.out.println(queue.getFirst());
                } else {
                    System.out.println(-1);
                }

                // [6] back
            } else if (command.equals("back")) {
                if (!queue.isEmpty()) {
                    System.out.println(queue.getLast());
                } else {
                    System.out.println(-1);
                }
            }


        }
    }
}

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

큐의 μ»€λ§¨λ“œλŠ” 총 N개이며, 각 μ»€λ§¨λ“œλŠ” push, pop, size, empty, front, back 쀑 ν•˜λ‚˜μ΄λ‹€.
μ΄λ•Œ μ‚¬μš©ν•œ LinkedList λ‚΄λΆ€ ν•¨μˆ˜ addLast, removeFirst, getFirst, getLast λ“±μ˜ μ‹œκ°„ λ³΅μž‘λ„κ°€ λͺ¨λ‘ O(1)μ΄λ―€λ‘œ,
전체 μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)이닀.


✏️ λŠλ‚€ 점

  • μŠ€νƒμ„ κ΅¬ν˜„ν• λ•Œλ„ LinkedList을 μ‚¬μš©ν•˜λŠ”κ²Œ λ§žμ•˜λ˜ 것 κ°™λ‹€. κ΅¬ν˜„-ꡬ쑰 상 이게 λ§žλ‹€.