알고리즘/알고리즘 유형

[백준] 17298_오큰수 - JAVA

데부한 2023. 5. 2. 22:08
반응형

백준_17298

 

17298번: 오큰수

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

www.acmicpc.net

 

스택

참고 포스팅

 

[백준] 1874_스택 수열 - JAVA

백준_1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.

devhan.tistory.com

 

 

코드

import java.io.*;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.valueOf(br.readLine());
        int[] A = new int[n]; // 수열 생성
        int[] answer = new int[n];  //정답 배열 생성
        String[] str = br.readLine().split(" ");

        for(int i = 0; i < n; i++) {
            A[i] = Integer.valueOf(str[i]);
        }

        Stack<Integer> myStack = new Stack<>();
        myStack.push(0);

        for(int i = 1; i < n; i++) {
            while(!myStack.isEmpty() && A[myStack.peek()] < A[i]) {
                answer[myStack.pop()] = A[i];
            }
            myStack.push(i);
        }
        while(!myStack.empty()) {

            answer[myStack.pop()] = -1;
    }
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        for(int i = 0; i < n; i++) {
            bw.write(answer[i] + " ");
        }
        bw.write("\n");
        bw.flush();
    }
}

이 문제에서 핵심으로 생각할 포인트는 아래와 같다.

- 스택에 새로 들어오는 수가 top에 존재하는 수보다 크면 그 수는 오큰수가 된다.

- 오큰수를 구한 수열에서 오큰수가 존재하지 않는 숫자에 -1을 출력한다.

 

 

제출 결과

 

 

반응형