백준 풀기

백준 10866번: 덱 with Java

삼겹살파튀 2025. 4. 20. 12:34

 
 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.5 초 (추가 시간 없음) 256 MB 96070 53514 44809 56.180%

문제

정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

  • push_front X: 정수 X를 덱의 앞에 넣는다.
  • push_back X: 정수 X를 덱의 뒤에 넣는다.
  • pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 덱에 들어있는 정수의 개수를 출력한다.
  • empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
  • front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1 복사

15
push_back 1
push_front 2
front
back
size
empty
pop_front
pop_back
pop_front
size
empty
pop_back
push_front 3
empty
front

예제 출력 1 복사

2
1
2
0
2
1
-1
0
1
-1
0
3

예제 입력 2 복사

22
front
back
pop_front
pop_back
push_front 1
front
pop_back
push_back 2
back
pop_front
push_front 10
push_front 333
front
back
pop_back
pop_back
push_back 20
push_back 1234
front
back
pop_back
pop_back

예제 출력 2 복사

-1
-1
-1
-1
1
1
2
2
333
10
10
333
20
1234
1234
20

 

 

 


 

 

덱.. 

또 지피티 소환

진심 자료구조 가물가물... 가물치 ㅈㅅ

 

 

덱(Double-Ended Queue)은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조입니다. 자바에서는 Deque 인터페이스로 제공되며, 이는 Queue 인터페이스를 확장한 것으로, 양방향 큐의 기능을 지원합니다.

주요 특징

  1. 양방향 삽입/삭제:
    • 덱은 양쪽 끝에서 요소를 삽입하고 삭제할 수 있어, **큐(Queue)**나 **스택(Stack)**처럼 한쪽 끝만 다루는 자료구조에 비해 더 유연하게 사용됩니다.
    • addFirst(), addLast(), removeFirst(), removeLast() 등을 통해 양쪽 끝에서 조작할 수 있습니다.
  2. Deque 인터페이스: 자바에서 덱은 java.util.Deque 인터페이스로 제공됩니다. 주요 구현체로는 ArrayDeque와 LinkedList가 있습니다.

주요 메서드

  • addFirst(E e): 덱의 앞부분에 요소 추가
  • addLast(E e): 덱의 뒷부분에 요소 추가
  • removeFirst(): 덱의 앞부분에서 요소 제거
  • removeLast(): 덱의 뒷부분에서 요소 제거
  • peekFirst(): 덱의 앞부분에서 요소를 제거하지 않고 확인
  • peekLast(): 덱의 뒷부분에서 요소를 제거하지 않고 확인

 

앗 아까 peekLast가 여기있구만 !!!!!!!!

확실히 양쪽 끝에서 요소 삽입 삭제 가능이면 딴 것보다 훨씬 유연하겠다 그치그치

 

이제 구현을 해볼까... 했는데......

  • push_front X: 정수 X를 덱의 앞에 넣는다.
  • push_back X: 정수 X를 덱의 뒤에 넣는다.

 

망했다

계속 디폴트로 날먹하고 있었는데... 이젠 쟤도 분류해야함

어케 분류해 망할!!!!!!!!!!

 

생각해보니까 첨부터 String 배열로 분류하면 되는 거였따...

아 default 하지 말 걸 지금 큐 코드 추가하러 갑니다..

스택도 추가해야지

 

 

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

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

        Deque<Integer> deque = new LinkedList<>();
        int N = Integer.parseInt(br.readLine());
        for (int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");
            switch (input[0]) {
                case "push_front":
                    int num = Integer.parseInt(input[1]);
                    deque.addFirst(num);
                    break;
                case "push_back":
                    int num = Integer.parseInt(input[1]);
                    deque.addLast(num);
                    break;
                case "pop_front":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.pollFirst());
                    break;
                case "pop_back":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.pollLast());
                    break;
                case "size":
                   System.out.println(deque.size());
                   break;
                case "empty":
                    if (deque.isEmpty()) {
                        System.out.println(1);
                        break;
                    }
                    System.out.println(0);
                    break;
                case "front":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.peekFirst());
                    break;
                case "back":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.peekLast());
                    break;
            }
        }
    }
}

 

 

 

또잉...

와이러노...

 

 

계속 고쳐봐도 안 돼서 결국 지피티한테 물어봄.

 

딱 하나만 고치면 됩니다! 지금 코드에서 case "push_back" 부분에 num 변수를 다시 선언하고 있어요. 그런데 이 num은 이미 위에서 push_front에서 선언된 지역 변수입니다.

Java에서는 같은 블록 안에서 동일한 이름의 변수를 다시 선언할 수 없습니다.

 

 

헉!!!! 스위치 케이스로 분리돼있어서 생각 못했던 문제... 같은 블록이라 다시 선언이 안 되는 거였다.

frontNum backNum 으로 각각 바꿔줬다.

 

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

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

        Deque<Integer> deque = new LinkedList<>();
        int N = Integer.parseInt(br.readLine());
        for (int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");
            switch (input[0]) {
                case "push_front":
                    int frontNum = Integer.parseInt(input[1]);
                    deque.addFirst(frontNum);
                    break;
                case "push_back":
                    int backNum = Integer.parseInt(input[1]);
                    deque.addLast(backNum);
                    break;
                case "pop_front":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.pollFirst());
                    break;
                case "pop_back":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.pollLast());
                    break;
                case "size":
                   System.out.println(deque.size());
                   break;
                case "empty":
                    if (deque.isEmpty()) {
                        System.out.println(1);
                        break;
                    }
                    System.out.println(0);
                    break;
                case "front":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.peekFirst());
                    break;
                case "back":
                    if (deque.isEmpty()) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(deque.peekLast());
                    break;
            }
        }
    }
}

 

 

 

스무스한 통과!!!

아 너무 쉬운 것만 풀었나?? 이따 시간 나면 한 개 더 풀어야겠다,,

결론은 확실히 덱이 사용성이 더 좋다. 근데 자꾸 디큐로 읽게 되는 건... 영알못이라서?🤔

 

 

 

덱...

Deque는 "Double Ended Queue"의 줄임말로,
양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조이다.

한쪽으로만 입력 가능하도록 설정한 덱을 스크롤(scroll)이라고 하며, 한쪽으로만 출력 가능하도록 설정한 덱을 셸프(shelf)라고 한다. 

 

🔸 덱의 주요 연산

명령어설명
push_front(x) x를 덱의 앞에 삽입
push_back(x) x를 덱의 뒤에 삽입
pop_front() 덱의 앞에서 요소 제거하고 반환 (없으면 -1)
pop_back() 덱의 뒤에서 요소 제거하고 반환 (없으면 -1)
front() 덱의 앞 요소 조회 (없으면 -1)
back() 덱의 뒤 요소 조회 (없으면 -1)
size() 덱에 들어있는 요소 개수 출력
empty() 덱이 비어있으면 1, 아니면 0 출력

 

🔹 Java에서 덱 구현 방법

Java에서는 Deque 인터페이스를 이용해 덱을 만들 수 있다.

LinkedList를 덱처럼 쓰거나 ArrayDeque를 사용한다.

  • deque.addFirst(x) → 앞에 삽입
  • deque.addLast(x) → 뒤에 삽입
  • deque.pollFirst() → 앞에서 꺼내기 (비어있으면 null)
  • deque.pollLast() → 뒤에서 꺼내기 (비어있으면 null)
  • deque.peekFirst() → 앞 요소 조회
  • deque.peekLast() → 뒤 요소 조회