백준/코드 플러스 (알고리즘 기초 - 1)

[백준] 200 - 자료구조 1 : 덱 (!) (10866번 JAVA)

MoveForward 2023. 1. 5. 12:36
728x90


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;


public class Main{
    public static int[] deque = new int[10000]; // 0~9999
    public static int front = 0;
    public static int rear = 0;
    public static int size = 0; // 덱에 들어있는 원소 수

    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            switch (st.nextToken()) {
                case "push_front":
                    push_front(Integer.parseInt(st.nextToken()));
                    break;
                
                case "push_back":
                    push_back(Integer.parseInt(st.nextToken()));
                    break;

                case "pop_front":
                    sb.append(pop_front()).append("\n");
                    break;

                case "pop_back":
                    sb.append(pop_back()).append("\n");
                    break;

                case "size":
                    sb.append(size()).append("\n");
                    break;

                case "empty":
                    sb.append(empty()).append("\n");
                    break;

                case "front":
                    sb.append(front()).append("\n");
                    break;

                case "back":
                    sb.append(back()).append("\n");
                    break;
            }
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    // push_front X: 정수 X를 덱의 앞에 넣는다.
    public static void push_front(int x) {
        deque[front] = x;
        front = (front - 1 + deque.length) % deque.length;
        size ++;
    }
    
    // push_back X: 정수 X를 덱의 뒤에 넣는다.
    public static void push_back(int x) {
        rear = (rear + 1) % deque.length;
        deque[rear] = x;
        size ++;
    }

    // pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    public static int pop_front() {
        if(front == rear) {return -1;}
        else {
            front = (front + 1) % deque.length;
            size --;
            return deque[front];
        }
    }

    // pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    public static int pop_back() {
        if(front == rear) {return -1;}
        else {
            int result = deque[rear];
            rear = (rear - 1 + deque.length) % deque.length;
            size --;
            return result;
        }
    }

    // size: 덱에 들어있는 정수의 개수를 출력한다.
    public static int size() {
        return size;
    }

    // empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
    public static int empty() {
        if(front == rear) {return 1;}
        else {return 0;}
    }

    // front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    public static int front() {
        if(front == rear){
            return -1;
        }
        else{
            return deque[(front + 1) % deque.length];
        }
    }

    // back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    public static int back() {
        if(front == rear){
            return -1;
        }
        else{
            return deque[rear];
        }
    }
}
728x90