새발블로그

[백준/Java] 18258 큐 2 본문

Problem Solving/Baekjoon

[백준/Java] 18258 큐 2

EUG 2025. 4. 2. 17:41

문제

https://www.acmicpc.net/problem/18258

 

풀이방법

1. Queue (FIFO: First In First Out)

Queue 선언

Queue<Integer> queue = new LinkedList<>();
  • LinkedList를 사용해 선언하는 것이 일반적
  • PriorityQueue를 사용하면 우선순위 큐로 활용 가능

Queue 주요 메서드

메서드 설명

offer(E e) 큐의 끝에 요소 추가 (add()도 가능하지만, 꽉 차면 IllegalStateException 발생)
poll() 큐의 첫 번째 요소 제거 후 반환 (비어있으면 null)
peek() 큐의 첫 번째 요소 조회 (비어있으면 null)
isEmpty() 큐가 비어있는지 확인 (true 또는 false 반환)
size() 큐의 크기 반환

Queue 예제

import java.util.*;

public class QueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        queue.offer(1);
        queue.offer(2);
        queue.offer(3);

        System.out.println(queue.poll()); // 1
        System.out.println(queue.peek()); // 2
        System.out.println(queue.isEmpty()); // false
    }
}

 

2. Deque (양방향 큐)

Deque 선언

Deque<Integer> deque = new LinkedList<>();
// 또는
Deque<Integer> deque = new ArrayDeque<>();
  • LinkedList와 ArrayDeque 둘 다 사용 가능
  • ArrayDeque가 성능상 더 유리함 (null을 허용하지 않음)

Deque 주요 메서드

메서드 설명

offerFirst(E e) 덱의 앞에 요소 추가
offerLast(E e) 덱의 뒤에 요소 추가
pollFirst() 덱의 앞 요소 제거 후 반환 (비어있으면 null)
pollLast() 덱의 뒤 요소 제거 후 반환 (비어있으면 null)
peekFirst() 덱의 앞 요소 조회 (비어있으면 null)
peekLast() 덱의 뒤 요소 조회 (비어있으면 null)
isEmpty() 덱이 비어있는지 확인
size() 덱의 크기 반환

Deque 예제

import java.util.*;

public class DequeExample {
    public static void main(String[] args) {
        Deque<Integer> deque = new ArrayDeque<>();

        deque.offerFirst(1);
        deque.offerLast(2);
        deque.offerLast(3);
        deque.offerFirst(0);

        System.out.println(deque.pollFirst()); // 0
        System.out.println(deque.pollLast()); // 3
        System.out.println(deque.peekFirst()); // 1
        System.out.println(deque.peekLast()); // 2
    }
}

 

https://www.acmicpc.net/problem/10845와 풀이가 같은데 StringBuilder를 사용해서 마지막에만 출력하였다.

 

풀이

import java.io.*;
import java.io.BufferedReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;


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());
        ArrayDeque<Integer> dq = new ArrayDeque<>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            StringTokenizer stz = new StringTokenizer(br.readLine());
            String cmd = stz.nextToken();

            if (cmd.equals("push")) {
                int num = Integer.parseInt(stz.nextToken());
                dq.offer(num);
            } else if (cmd.equals("pop")) {
                if (dq.isEmpty()) {
                    sb.append(-1).append("\n");
                } else {
                    sb.append(dq.poll()).append("\n");

                }
            } else if (cmd.equals("size")) {
                sb.append(dq.size()).append("\n");
            } else if (cmd.equals("empty")) {
                sb.append(dq.isEmpty() ? 1 : 0).append("\n");
            } else if (cmd.equals("front")) {
                sb.append(dq.isEmpty() ? -1 : dq.peek()).append("\n");
            } else if (cmd.equals("back")){
                sb.append(dq.isEmpty() ? -1 : dq.peekLast()).append("\n");
            }
        }
        System.out.print(sb.toString());

    }
}