[BOJ]1874号:スタック数列(Java)


質問する



1874号:スタック数列

コード(JAVA)

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

public class Main{
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		Stack<Integer> stack = new Stack<>();
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		for(int i =0 ;i < n ; i++) arr[i] =  Integer.parseInt(br.readLine());
		int cnt = 1;
		int i;
		for(i =0 ; i < n ; i++) {
			if(stack.isEmpty()) {
				if(cnt>arr[i]) break;
				stack.push(cnt++);
				sb.append("+\n");
			}
			if(arr[i] > stack.peek()) {
				if(cnt > arr[i]) break;
				while(stack.peek() != arr[i]) {
					stack.push(cnt++);
					sb.append("+\n");
				}
			}
			else if(arr[i] < stack.peek()) {
				while(stack.peek() != arr[i]) {
					stack.pop();
					sb.append("-\n");
				}
			}
			if(arr[i] == stack.peek()) {
				stack.pop();
				sb.append("-\n");
			}
		}
		if(i != n || !stack.isEmpty()) System.out.println("NO");
		else System.out.print(sb.toString());
	}
}

説明:


入力:BufferedReader
出力:StringBuilder
デフォルトでは、 
現在比較されている配列値(arr[i])と現在のスタックの上部の値を比較します.
If(arr[i]>stack.peek()の場合、
スタックにはこの値は含まれていません(arr[i]).cntをスタックに押し込みpeek()=arr[i]
If(arr[i]スタックにこの値が含まれます.pop値arr[i]より前のpop
💡 この時、気をつけなければならない点.
pushの場合、比較する値が現在のスタックの値(cnt)より大きい場合、
スタックはarr[i]より大きい値をスタックし続け、最終的に無限ループを迂回する.
ブランチ文を十分に活用してこそ、メモリオーバーフローとタイムアウトを回避できます.

反例(私のコード基準!)

1
1
+
-
3
1
2
3
+
-
+
-
+
-
4
4
2
3
1
NO