곽로그

[백준 17298, Java] 오큰수 본문

알고리즘/백준

[백준 17298, Java] 오큰수

일도이동 2020. 10. 31. 01:35
반응형

문제

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

 

풀이

1. 순회 (시간초과)

- 오큰수를 순회로 풀면 시간 초과가 난다. 즉 수열을 순회하면서 index번째 수의 오큰수를 구할 때, 다시 index+1 부터 순회를 하게되면 시간 복잡도는 N제곱이 되어서 시간초과가 난다.

 

2. 스택이용

- A의 오큰수 B를 구하는 게 아닌, B가 어떤 수의 오큰수가 되는지를 역으로 구해야한다. 

- B가 A의 오큰수이면 A와 B사이의 수 중에서 B가 가장 큰 수인 것을 이용한다. 

- 스택에는 아직 오큰수를 구하지 못한 수열의 인덱스가 들어간다. 

- 솔직히 아무런 힌트가 주어지지 않으면 못풀 것 같다.

 

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int[] numArray = new int[N];
        int[] oNum =  new int[N];
        Stack<Integer> stack = new Stack<>();

        st = new StringTokenizer(br.readLine(), " ");
        for(int index = 0; index<N; index++){
            numArray[index] = Integer.parseInt(st.nextToken());
        }

        for(int index = 0 ;index<numArray.length; index++){
            int num = numArray[index];

            while(!stack.isEmpty()){
                if(numArray[stack.peek()]<num){
                    oNum[stack.pop()] = num;
                }
                else{
                    break;
                }
            }
            stack.push(index);
        }

        while(!stack.isEmpty()){
            oNum[stack.pop()] = -1;
        }

        for(int index = 0; index<oNum.length; index++){
            bw.write(String.valueOf(oNum[index])+" ");
        }
        bw.flush();
        bw.close();

    }
}

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1987, Java] 소수찾기  (0) 2020.11.02
[백준 1929, Java] 소수구하기  (0) 2020.11.02
[백준 10799, Java] 쇠막대기  (0) 2020.10.28
[백준 17413, Java] 단어 뒤집기2  (0) 2020.10.28
[백준 1406, Java] 에디터  (0) 2020.10.28
Comments