ALGORITHM

[JAVA] 백준 17298번- 오큰수

연듀 2022. 10. 9. 12:00

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

 

17298번: 오큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

 

 

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

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];
        int[] answer = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Stack<Integer> stack = new Stack<>();

        for(int i=n-1; i>=0; i--){
            while(!stack.isEmpty() && stack.peek() <= arr[i]){ // 스택이 비어있지 않고 스택의 top이 수열 값보다 작다면
                stack.pop();
            }
            if(stack.isEmpty()) answer[i] = -1; // 수열 값보다 큰 스택의 top 값이 없으면
            else answer[i] = stack.peek(); // 스택의 top 이 수열 값보다 크면 스택의 top 값 기록

            stack.push(arr[i]); // 스택에 수열 값 저장
        }

        for(int x : answer){
            sb.append(x).append(" ");
        }

        System.out.println(sb);
    }
}

 

 

처음에 이중 for문 (시간 복잡도 O(N^))으로 했다가 당연히 시간초과가 났다. 

위와 같은 방법으로 스택을 사용 하면 시간 복잡도 O(N)으로 시간초과 없이 풀 수 있다.

입력받은 수열을 arr 배열에 넣고, 배열의 오른쪽부터 탐색한다.

스택에 수열 값을 넣고, 스택이 비게되거나 스택의 top이 현재 수열 값보다 클 때까지 스택을 pop한다.

그렇게 해 스택이 모두 비워지게 된다면 오큰수가 없는 것이므로 -1을 기록하고,

수열 값보다 큰 스택의 top 값을 만나면 그 값을 기록한다.

 

 

 

 

 

'ALGORITHM' 카테고리의 다른 글

[JAVA] 백준 11656번- 접미사 배열  (0) 2022.10.09
[JAVA] 백준 10820번- 문자열 분석  (0) 2022.10.09
[JAVA] 백준 1406번- 에디터  (0) 2022.10.07
[JAVA] 백준 10866번- 덱  (0) 2022.10.05
[JAVA] 백준 10845번- 큐  (0) 2022.10.05