Programing/BaekJoon

[JAVA] 백준 1874 : 스택 수열

블스뜸 2025. 3. 31. 17:46
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder();
        int count = Integer.parseInt(br.readLine());
        NodeManager nodeManager = new NodeManager();
        int pushCnt = 1;
        for (int i = 0; i < count; i++) {
            int value = Integer.parseInt(br.readLine());
            // 비었을 때, value == top일 때, top < value일 때 + pushCnt <= value, top < value + pushCnt > value, top > value
            if (nodeManager.isEmpty()) {
                for (int j = pushCnt; j <= value; j++) {
                    nodeManager.push(new StackNode(j));
                    result.append("+\n");
                    pushCnt++;
                }
                nodeManager.pop();
                result.append("-\n");
            } else if (nodeManager.peek() == value) {
                nodeManager.pop();
                result.append("-\n");
            } else if(nodeManager.peek() < value && pushCnt <= value){
                for(int j = pushCnt; j <= value; j++){
                    nodeManager.push(new StackNode(j));
                    result.append("+\n");
                    pushCnt++;
                }
                nodeManager.pop();
                result.append("-\n");
            }else{
                result = new StringBuilder("NO");
                break;
            }
        }

        bw.write(String.valueOf(result));

        bw.flush();
        bw.close();
        br.close();
    }
}

class StackNode {
    private final int value;
    private StackNode prevNode;

    public StackNode(int value) {
        this.value = value;
        prevNode = null;
    }

    public int getValue() {
        return value;
    }

    public StackNode getPrevNode() {
        return prevNode;
    }

    public void setPrevNode(StackNode prevNode) {
        this.prevNode = prevNode;
    }
}

class NodeManager {
    private StackNode top;
    private int size;

    public NodeManager() {
        top = null;
        size = 0;
    }

    public StackNode getTop() {
        return top;
    }

    public boolean isEmpty() {
        return top == null;
    }

    public int getSize() {
        return size;
    }

    public void push(StackNode node) {
        if (isEmpty()) top = node;
        else {
            node.setPrevNode(top);
            top = node;
        }
        size++;
    }

    public StackNode pop() {
        if (isEmpty()) return null;
        StackNode node = top;
        top = top.getPrevNode() == null ? null : top.getPrevNode();
        size--;
        return node;
    }

    public int peek() {
        return top.getValue();
    }


}