백준 17298 오큰수(Gold 4)

Wonkyun Jung·2023년 2월 14일
0

알고리즘

목록 보기
17/59
post-thumbnail

정답코드

import java.io.*;
import java.util.Stack;
public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		int N = Integer.parseInt(br.readLine()); 
		int [] Number = new int[N];
		int [] Result = new int[N];
		
		String[] input = br.readLine().split(" ");
		
		for(int i = 0; i < N; i++) {
			Number[i] = Integer.parseInt(input[i]);
		}
		
		Stack<Integer> st = new Stack<>(); 
		
		for (int i = 0; i<N; i++) {
		
			while(!st.empty()&&Number[st.peek()]<Number[i]) {
				//지금 들어갈 수가 오큰수일 때
				Number[st.pop()] = Number[i];
				
			}
			st.push(i);
		}
		
		while(!st.isEmpty()) {
			Number[st.pop()] = -1;
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < N; i++) {
			sb.append(Number[i]).append(" ");
		}
		
		System.out.println(sb);
		
	}

}



전략

  • 처음엔 뒤에서도 스택을 넣어보고 앞에서도 넣어보고 별 로직 다 생각해봤지만 시간초과로 처참히 패배 N≥1000000 이기 때문에 → so O(N) 아니면 최대 N*O(logN)에 해결할 수 있어야함


  • 힌트: 배열과 인덱스를 이용하자. 꼭 값을 스택에 넣어야 한다는 것은 고정관념 인덱스를 스택에 넣어도 상관 없음

0개의 댓글