[BOJ 17298] 오큰수 (java)

1 minute read

:pencil2: 문제 링크 https://www.acmicpc.net/problem/17298 :pencil2:

이중for문으로 다 푼줄 알았는데 제출했더니 시간초과가 났다 ㅠ 그래서 백준 참고해서 풀었더니 무난히 통과

문제

/* 시간 초과때문에 통과 x인 코드
	 * BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		Stack<Integer> stack = new Stack<Integer>();
		int n = Integer.parseInt(br.readLine());
		Integer[] array = new Integer[n];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i =0;i<n;i++) {
			array[i]=Integer.parseInt(st.nextToken());
		}
		
		for (int i = 0; i < n; i++) {
			stack.clear();
			for (int j = n - 1; j != i; j--) {
				if (array[i] < array[j]) {
					stack.push(array[j]);
				}
			}
			if (!stack.isEmpty()) {
				bw.write(stack.pop()+" ");
			}else {
				bw.write(-1+" ");
			}
		}
		
		bw.flush();
		bw.close();

	}*/

문제 풀이

package basics_200;

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 BOJ17298 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		Stack<Integer> stack = new Stack<Integer>();
		int n = Integer.parseInt(br.readLine());
		Integer[] array = new Integer[n];
		Integer[] result = new Integer[n];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < n; i++) {
			array[i] = Integer.parseInt(st.nextToken());
		}

		stack.push(0);
		for (int j = 1; j < n; j++) {
			// 바로옆의 수가 오큰수라면
			// 해당 인덱스(스택 맨위)에 오큰수를 넣어주고, 오큰수를 찾았으니까 스택에서 pop
			// ! 스택에 인덱스를 저장해두는거니까 오큰수를 꼭 차례대로 찾아야한다는 생각을 버리기 !
			while (!stack.isEmpty() && array[stack.peek()] < array[j]) {
				result[stack.peek()] = array[j];
				stack.pop();
			}
			stack.push(j);
		}
		
		//for문을 다 돌고나면 스택에 가장 마지막 수가 있음 
		while(!stack.isEmpty()) {
			result[stack.peek()]=-1;
			stack.pop();
		}
		
		for(int number:result) {
			bw.write(number+" ");
		}

		bw.flush();
		bw.close();

	}

Comments