[Baekjoon]10845号(SILVER IV):Q(Java)


1. Problem 📃
[Q]
https://www.acmicpc.net/problem/10845
[質問]
整数を格納するキューを実装し、入力としてのコマンドを処理するプログラムを作成してください.
命令は全部で6条ある.
  • push X:整数Xをキューに入れる演算.
  • pop:キューの一番前の整数を除いて、その数値を出力します.キューに整数がない場合は、-1が出力されます.
  • size:出力キューの整数の個数.
  • NULL:キューがNULLの場合、1または0が出力されます.
  • front:出力キューの一番前の整数.キューに整数がない場合は、-1が出力されます.
  • back:出力キューの一番後ろの整数.キューに整数がない場合は、-1が出力されます.
  • 2. Input ⌨️
    [入力]
    1行目に与えられるコマンド数N(1≦N≦10000).
    2行目からN行目までそれぞれ1つのコマンドがあります.
    与えられた整数は1以上であり、100000以下である.
    問題にない命令はない.
    3. Output 🖨
    [出力]
    出力するコマンドが発行されるたびに、各行に1つのコマンドが出力されます.
    4. Example 📚
    [IO例]
    例入力例出力15 push 1 push 2 f r o n t b a c k s i z e m p u t o psizeemputopsizeempumputopush 3 emptyfront 1222012-101-103
    5. Solution 🔑
    問題のpush popsize、empty、front、backは、実装方法によって問題を解決します.
    1.staticを使用してキューを表す配列変数(queue)をコマンドの最大数10000とするので、10000個の値を入力することもできます.したがって、サイズは10000と宣言されます.
    寸法を表す変数(size)とpoll()のため、一番前の値が欠けている場合は、一番前の変数(front)と一番後ろの変数(back)を0に初期化して宣言します.
    pushは、キューに値を入れるコマンドです.
    配列変数queueのbackに値を入れます.(sizeはポーリング時に失われる可能性があるため)
    sizeが増加したため、sizeは++(増加)増加し、back値も+(増加)増加した.
    3.popは一番前の値を消して出力するコマンドです.
    キューが空(size==0)の場合、-1が返されます.
    そうでなければ、一番前を表すqueue[front]値を変数(n)に含め、値を減算するのでsizeを--(減算)、frontも1つのセルの後ろに移動するので、front値を+(増加)に設定します.そして中に入っているnを返します.
    4.sizeは出力キュー長のコマンドです.
    size値を返します.
    5.NULLは、キューに値の有無を出力するコマンドです.
    アレイキューが空の場合(size==0)、1値を返します.そうでない場合、0値を返します.
    6.frontは、最前面値を出力するコマンドです.
    配列が空の場合は-1を返し、そうでない場合は配列変数queueのfrontインデックスを返します.
    7.backは最後尾値を出力するコマンドです.
    配列が空の場合は-1を返します.そうでない場合は、配列変数queueのback-1インデックスを返します.
    8.マスターメソッドで何回コマンドを受信したかを入力する変数(N).
    9.戻り値がある場合、コマンドを受信するたびに、スイッチ文で入力した値に一致するコードが実行されます.
    StringBuilder(sb)に装着して行を開きます.
    10.最終出力StringBuilder(sb).
    6. Code 💻
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main {
    
    	static int[] queue = new int[10000];
    	static int size = 0;
    	static int front = 0;
    	static int back = 0;
    	
    	// push X: 정수 X를 큐에 넣는 연산이다.
    	public static void push (int val) {
    		queue[back] = val;
    		size++;
    		back++;
    	}
    	// pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    	public static int pop() {
    		if(size == 0) {
    			return -1;
    		}
    		else {
    			int n = queue[front];
    			size--;
    			front++;
    			return n;
    		}
    	}
    	// size: 큐에 들어있는 정수의 개수를 출력한다.
    	public static int size() {
    		return size ;
    	}
    	// empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
    	public static int empty() {
    		if(size == 0) {
    			return 1;
    		}
    		else {
    			return 0;
    		}
    	}
    	// front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    	public static int front() {
    		if(size == 0) {
    			return -1;
    		}
    		else {
    			return queue[front];
    		}
    	}
    	// back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    	public static int back() {
    		if(size == 0) {
    			return -1;
    		}
    		else {
    			return queue[back - 1];
    		}
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		StringBuilder sb = new StringBuilder();
    		
    		int N = Integer.parseInt(st.nextToken());
    		
    		for(int i=0; i<N; i++) {
    			
    			st = new StringTokenizer(br.readLine(), " ");
    			
    			switch(st.nextToken()) {
    			case "push" :
    				push(Integer.parseInt(st.nextToken()));
    				break;
    				
    			case "pop" :
    				sb.append(pop()).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;
    			}
    		}
    		System.out.println(sb);
    	}
    
    }