[伯俊]14298-呉大洙(Java)
11662 ワード
まずはこれが私が初めて出した黄金問題…!完全に自分の力で解決することはできないが、失敗した.
各段階の解答では,スタックカテゴリの問題であるため,より多くのヒントを与えた.
方法
この問題を初めて読んだとき、なぜスタックを書くのですか.という考えが生まれた.最初に思いついた方法は二重砲口です.しかし、砲撃すると時間的複雑度は
O(n^2)
で、タイムアウトで通過できない.だから自然とスタックを使う理由がわかりました.論理的説明
まず、ここでは、数列の各要素を指す
변수 t
が必要であり、答えを求めるためには、一時的に置かれるtemp스택
と、真の答えを含むNGE스택
が必要である.t(数列)は後ろから順番にチェックします.
NGE.push(-1);
temp.push(t);
NGE.push(-1);
temp.push(t);
NGE.push(temp.peek());
=>tの最大数temp.push(t);
インプリメンテーションコード
import java.io.*;
import java.util.*;
import java.util.Stack;
public class No17298_오큰수 {
public static void main(String[] args) throws IOException, EmptyStackException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int tc = Integer.parseInt(br.readLine());
String[] str = br.readLine().split(" ");
Stack<Integer> temp = new Stack<>();
Stack<Integer> NGE = new Stack<>();
int t=0;
for (int i=tc-1;i>=0;i--) {
t=Integer.parseInt(str[i]);
if(temp.isEmpty()) {
NGE.add(-1);
temp.push(t);
}
else {
while (!temp.isEmpty() && t >= temp.peek())
temp.pop();
if (!temp.isEmpty()) {
NGE.add(temp.peek());
}
else {
NGE.add(-1);
}
temp.add(t);
}
}
for (int i=0;i<tc;i++)
sb.append(NGE.pop()+" ");
System.out.println(sb.toString());
}
}
これにより時間複雑度をO(N)に低減することができる.最初は3つのスタックを使っていたが、またタイムアウトした.この方法はまだ難しいと思いますが、解題方法さえ身につけていれば、ゆっくり練習すればいいと思います!
Reference
この問題について([伯俊]14298-呉大洙(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@kekim20/백준-14298-오큰수Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol