파게로그

[백준 17298번] 오큰수 본문

콤퓨타 왕왕기초/PS

[백준 17298번] 오큰수

파게 2021. 3. 30. 01:09

문제 링크: 17298번 오큰수

https://www.acmicpc.net/problem/17298

 

프로그래머스 레벨 2였나... 주식 가격 문제와 비슷하다.

수열의 원소들을 쭉 받아주면서, 해당 숫자의 인덱스와 함께 묶어 스택에 push한다.

그리고 스택의 top에 있는 숫자보다 새로 받은 숫자가 더 크면, 더 작은 숫자가 나올때까지 스택을 pop해나가면서 각 인덱스에 새로 받은 숫자를 채워준다.

이런 과정을 반복했을 때 남은 숫자는 자신보다 더 큰 숫자를 만나지 못한 숫자들이므로, 스택에 남아있는 모든 아이템을 확인하면서 해당 인덱스의 자리에 -1을 채워준다.

 

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; import java.util.StringTokenizer; public class Main { ​​​​static class NumAndIdx { ​​​​​​​​int num; ​​​​​​​​int idx; ​​​​​​​​NumAndIdx (int num, int idx) { ​​​​​​​​​​​​this.num = num; ​​​​​​​​​​​​this.idx = idx; ​​​​​​​​} ​​​​} ​​​​public static void main(String[] args) throws IOException { ​​​​​​​​BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ​​​​​​​​StringTokenizer st; ​​​​​​​​st = new StringTokenizer(br.readLine()); ​​​​​​​​int n = Integer.parseInt(st.nextToken()); ​​​​​​​​int[] answer = new int[n]; ​​​​​​​​Stack<NumAndIdx> stack = new Stack<>(); ​​​​​​​​st = new StringTokenizer(br.readLine()); ​​​​​​​​for (int idx = 0; idx < n; idx++) { ​​​​​​​​​​​​int cur = Integer.parseInt(st.nextToken()); ​​​​​​​​​​​​while (!stack.isEmpty() && cur > stack.peek().num) { ​​​​​​​​​​​​​​​​NumAndIdx top = stack.pop(); ​​​​​​​​​​​​​​​​answer[top.idx] = cur; ​​​​​​​​​​​​} ​​​​​​​​​​​​stack.push(new NumAndIdx(cur, idx)); ​​​​​​​​} ​​​​​​​​while (!stack.empty()) ​​​​​​​​​​​​answer[stack.pop().idx] = -1; ​​​​​​​​StringBuilder sb = new StringBuilder(); ​​​​​​​​for (int item : answer) ​​​​​​​​​​​​sb.append(item).append(' '); ​​​​​​​​System.out.print(sb); ​​​​} }