본문 바로가기
알고리즘 & 자료구조/백준

백준 17298

by 신재권 2021. 8. 9.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main17298 {

	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;
		Stack<Integer> stack = new Stack<Integer>();
		StringBuilder sb = new StringBuilder();
		
		//N개의 수 입력 받음 
		int N = Integer.parseInt(br.readLine());
		
		int[] num = new int[N];
		int[] ans = new int[N];

		//수열 입력 받음 
		String str = br.readLine(); 
		st = new StringTokenizer(str); //공백을 기준으로 숫자를 잘라줌 
		
		for(int i=0; i<N; i++){
			num[i] = Integer.parseInt(st.nextToken());
		}
		
		for(int i=0; i<N; i++){
			if(stack.empty()){ //스택이 비어있다면 push
				stack.push(i);
			}
			while(!stack.empty() && num[stack.peek()] < num[i]){ //스택 top 보다 현재 값이 더 클때
				ans[stack.pop()] = num[i]; //다 넣어준다 (top이 더 크면 중지 ) 
			}
			stack.push(i); //다하면 인덱스값 넣어줌 
		}
		while(!stack.empty()){ //위의 과정이 끝나고 스택에 남아있는 수들은 오큰수를 찾지 못한 수이다.
			ans[stack.pop()] = -1;
		}
		for(int i=0; i<N; i++){
			if(i == N-1){
				sb.append(ans[i]);
				break;
			}
			sb.append(ans[i]).append(" ");
		}
		bw.write(sb.toString());
		bw.close();
		br.close();
		
	}

}

'알고리즘 & 자료구조 > 백준' 카테고리의 다른 글

백준 1934  (0) 2021.08.10
백준 17299  (0) 2021.08.09
백준 10799  (0) 2021.08.09
백준 17413  (0) 2021.08.09
백준 10866  (0) 2021.08.07