μ΅œλŒ€ 1 λΆ„ μ†Œμš”

πŸ“ [G5_2493] 탑

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		Stack<Integer> rootStack = new Stack<>();
		Stack<Integer> indexStack = new Stack<>();
		
		int N = Integer.parseInt(br.readLine());
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int first = Integer.parseInt(st.nextToken());
		rootStack.push(first);
		indexStack.push(1);
		sb.append("0 ");
		
		for(int i=2; i<=N; i++) {
			int value = Integer.parseInt(st.nextToken());
			
			while(!rootStack.isEmpty()) {
				// stack에 μžˆλŠ” 값이 μƒˆλ‘œ push λ˜λ €λŠ” 값보닀 클 경우
				if(value < rootStack.peek()) {
					sb.append(indexStack.peek() + " ");
					break;
				}
				// stack에 μžˆλŠ” 값이 μƒˆλ‘œ push λ˜λ €λŠ” 값보닀 μž‘μ„ 경우
				rootStack.pop();
				indexStack.pop();
			}
			
			// stack이 λΉ„μ–΄μžˆμ„ 경우
			if(rootStack.isEmpty()) {
				sb.append("0 ");
			}
			rootStack.push(value);
			indexStack.push(i);
		}
		System.out.println(sb.toString());
	}	
}

πŸ€” λ‚˜μ˜ 생각

μ²˜μŒμ— 2쀑 for문으둜 ν’€μ—ˆλŠ”λ° μ—­μ‹œ N이 큰 탓인지 μ‹œκ°„, λ©”λͺ¨λ¦¬ 였λ₯˜κ°€ λ–΄λ‹€.
κ·Έλž˜μ„œ 방법을 κ³ λ―Όν•˜λ‹€κ°€ λ„μ €νžˆ 생각이 μ•ˆλ‚˜μ„œ ꡬ글링을 톡해 STACK을 톡해 ν‘ΈλŠ” 방법을 μ•Œκ²Œ λ˜μ—ˆλ‹€..
두 개의 STACK을 μ΄μš©ν•΄ index와 νƒ‘μ˜ 높이λ₯Ό pushν•˜λ €λŠ” 값이 더 큰경우, μž‘μ€κ²½μš°, STACK이 빈 경우λ₯Ό λ‚˜λˆ μ„œ ν’€μ–΄μ£Όμ—ˆλ‹€.