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();
    }

}