Programing/BaekJoon
[JAVA] 백준 17298 : 오큰수
블스뜸
2025. 4. 1. 18:33
시간제한이 최대 NlogN이라 많이 해맸다
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int count = Integer.parseInt(br.readLine());
int[] arr = new int[count];
int[] result = new int[count];
st = new StringTokenizer(br.readLine());
// 입력값 삽입 + 결과배열 -1로 초기화
for (int i = 0; i < count; i++) {
arr[i] = Integer.parseInt(st.nextToken());
result[i] = -1;
}
NodeManager nodeManager = new NodeManager();
for (int i = 0; i < count; i++) {
while (!nodeManager.isEmpty() && arr[nodeManager.peek()] < arr[i]) {
result[nodeManager.pop()] = arr[i];
}
nodeManager.push(new StackNode(i));
}
for (int i = 0; i < count; i++) {
bw.write(result[i] + " ");
}
br.close();
bw.flush();
bw.close();
}
public static int search(StackNode node, int value){
try {
if (node.getValue() > value){
return node.getValue();
}
}catch (NullPointerException e){
return -1;
}
return search(node.getUnderNode(), value);
}
}
class StackNode {
StackNode underNode;
int value;
public StackNode(int value) {
this.value = value;
underNode = null;
}
public int getValue() {
return value;
}
public StackNode getUnderNode() {
return underNode;
}
public void setUnderNode(StackNode underNode) {
this.underNode = underNode;
}
}
class NodeManager {
int size;
StackNode top;
public NodeManager() {
size = 0;
top = null;
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return top == null;
}
public void push(StackNode node) {
if (isEmpty()) {
top = node;
} else {
node.setUnderNode(top);
top = node;
}
size++;
}
public int pop() {
StackNode node = top;
if (isEmpty()) return -1;
else if (top.getUnderNode() == null) {
top = null;
} else {
top = top.getUnderNode();
}
size--;
return node.getValue();
}
public int peek(){
if(isEmpty()) return -1;
return top.getValue();
}
}