본문 바로가기

백준/JAVA

[Baekjoon/JAVA] 10845번 - 큐

Baekjoon Online Judge

문제로 이동

 

문제

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

명령은 총 여섯 가지이다.

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

 

입력

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

 

출력

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

 


예제 입력 예제 출력
15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front
1
2
2
0
1
2
-1
0
1
-1
0
3

풀이

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

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

        StringTokenizer st;
        queue queue = new queue();

        int N = Integer.parseInt(br.readLine()); // 명령의 수

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());

            String s = st.nextToken();
            int num = 0;

            switch (s) { // 명령 수행
                case "push":
                    num = Integer.parseInt(st.nextToken());
                    queue.push(num);
                    break;
                case "pop":
                    num = queue.pop();
                    break;
                case "size":
                    num = queue.size();
                    break;
                case "empty":
                    num = queue.empty();
                    break;
                case "front":
                    num = queue.front();
                    break;
                case "back":
                    num = queue.back();
                    break;
            }

            // 출력
            if (!s.equals("push"))
                System.out.println(num);
        }
    }
}

class queue {
    int f = -1; // 큐의 가장 앞
    int b = -1; // 큐의 가장 뒤
    int[] element = new int[10001];

    // 정수 X를 큐에 넣는 연산
    public void push(int x) {
        element[++b] = x;
    }

    // 큐에서 가장 앞에 있는 정수를 뺀다.
    public int pop() {
        if(empty() == 1)
            return -1;
        else
            return element[++f];
    }

    // 큐에 들어있는 정수의 개수
    public int size() {
        return b - f;
    }

    // 큐가 비어있으면 1, 아니면 0
    public int empty() {
        if (b <= f || b == -1)
            return 1;
        else
             return 0;
    }

    // 큐의 가장 앞에 있는 정수
    public int front() {
        if (empty() == 1)
            return -1;
        else
            return element[f + 1];
    }

    // 큐의 가장 뒤에 있는 정수
    public int back() {
        if(empty() == 1)
            return -1;
        else
            return element[b];
    }
}

시간 제한이 무척이나 촉박하기 때문에 이번 코드에서는 StringTokenizer를 사용해서 값을 입력받았다.