[문제풀이] BOJ 10866. 덱

𝒄𝒉𝒂𝒏𝒎𝒊𝒏·2023년 12월 8일

Baekjoon Online Judge 알고리즘 문제풀이(Java)

BOJ 10866. 덱
(출처 : 문제의 저작권은 BOJ에 있습니다. )


🗒️ 문제

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

명령은 총 여덟 가지이다.

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

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

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

테스트 케이스는 BOJ의 해당 문제를 확인 바랍니다.


🎈 나의 풀이

package AlgorithmBase1;

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

public class P10866 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        Deque DQ = new Deque();


        for(int i=0; i<n; i++) {
            String[] strArr = br.readLine().split(" ");

            switch (strArr[0]) {
                case "push_front":
                    DQ.push_front(Integer.parseInt(strArr[1]));
                    break;
                case "push_back":
                    DQ.push_back(Integer.parseInt(strArr[1]));
                    break;
                case "pop_front":
                    bw.write(DQ.pop_front() + "\n");
                    break;
                case "pop_back":
                    bw.write(DQ.pop_back() + "\n");
                    break;
                case "size":
                    bw.write(DQ.size() + "\n");
                    break;
                case "empty":
                    bw.write(DQ.empty() + "\n");
                    break;
                case "front":
                    bw.write(DQ.front() + "\n");
                    break;
                case "back":
                    bw.write(DQ.back() + "\n");
                    break;
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }

    private static class Deque {
        LinkedList<Integer> list;

        public Deque() {
            list = new LinkedList<>();
        }
        public void push_front(int n) {
            list.addFirst(n);
        }
        public void push_back(int n) {
            list.addLast(n);
        }
        public int pop_front() {
            if(list.isEmpty()) return -1;
            int i = list.getFirst();
            list.removeFirst();
            return i;
        }
        public int pop_back() {
            if(list.isEmpty()) return -1;
            int i = list.getLast();
            list.removeLast();
            return i;
        }
        public int size() {
            return list.size();
        }
        public int empty() {
            return list.isEmpty() ? 1 : 0;
        }
        public int front() {
            if(list.isEmpty()) return -1;
            return list.getFirst();
        }
        public int back() {
            if(list.isEmpty()) return -1;
            return list.getLast();
        }
    }
}


💬 짚어가기

해당 문제는 LinkedList 자료구조를 이용하여 풀 수 있다.
연결리스트는 데이터를 추가하거나 삭제하는 연산에 유리하다. (시간 복잡도 : O(1)O(1))
특별한 로직 없이 구현된 코드를 참고바란다.

profile
𝑶𝒏𝒆 𝒅𝒂𝒚 𝒐𝒓 𝒅𝒂𝒚 𝒐𝒏𝒆.

0개의 댓글