[BOJ]1874号:スタック数列(Java)
2167 ワード
質問する
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]
💡 この時、気をつけなければならない点.
pushの場合、比較する値が現在のスタックの値(cnt)より大きい場合、
スタックはarr[i]より大きい値をスタックし続け、最終的に無限ループを迂回する.
ブランチ文を十分に活用してこそ、メモリオーバーフローとタイムアウトを回避できます.
反例(私のコード基準!)
1
1
+
-
3
1
2
3
+
-
+
-
+
-
4
4
2
3
1
NO
Reference
この問題について([BOJ]1874号:スタック数列(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@dot2__/BOJ-1874번-스택수열-Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol