코테/백준

[백준/JAVA] 17298번: 오큰수

imname1am 2023. 6. 13. 11:27
반응형

🔺 문제

 

17298번: 오큰수

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

www.acmicpc.net

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
        int[] seq = new int[n]; // 수열 배열
        int[] ans = new int[n]; // 정답 배열
        
        String[] str = br.readLine().split(" ");
        for(int i = 0 ; i < n ; i++) {
           seq[i] = Integer.parseInt(str[i]);
        }
        
        Stack<Integer> stack = new Stack<>();
        stack.push(0);  // 최초 값  push
        
        for(int i = 1 ; i < n ; i++) {
            // 스택이 비어있지 않고, 현재 수열 값이 top
            while(!stack.isEmpty() && seq[stack.peek()] < seq[i]) {
                ans[stack.pop()] = seq[i];    // 정답 배열에 오큰수를 현재 수열로 저장
            }
            stack.push(i);  // 신규 데이터 push
        }
        
        while(!stack.isEmpty()) {
            // 반복문을 다 돌고 나왔는데 스택이 비어있지 않다면, 빌 때까지
            ans[stack.pop()] = -1;  // 스택에 쌓인 idx에 -1을 넣음
        }
        
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        for(int i : ans) {
            bw.write(i + " ");
        }
        bw.write("\n");
        bw.flush();
    }
}
cs
✅ 해결 아이디어
✔ 스택
① 스택이 채워져있고, A[idx] > A[top] 인 경우 pop한 인덱스를 이용해 정답 수열에 오큰수 저장.
     pop은 조건을 만족하는 동안 반복.
② 현재 인덱스를 스택에 push하고 다음 인덱스로 넘어가기
③ 1,2를 수열 길이만큼 반복 후, 현재 스택에 남아 있는 인덱스에 -1 저장

 

💥 유의사항

• N의 크기가 큰 관계로(1,000,000) 반복문은 꿈도 꾸지 말어라..

• 스택에 수열의 값이 아닌, 인덱스를 저장!

 


🔺 다른 풀이들

- 최고의 설명..

 

[백준] 17298번 : 오큰수 - JAVA [자바]

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 문제 Stack의 원리를

st-lab.tistory.com

 

 

- 과정 설명 굿..

 

[백준 17298번] 오큰수 (java)

백준 17298번 : 오큰수 17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net res 배열에는 각 원소

lotuslee.tistory.com


💬 느낀 점

이 문제를 보고 스택을 이용할 생각을 하는 거 자체가 큰 미션 아닐까....

복습을 50번은 해야할 것 같다...ㅎ

 

1회독 2회독 3회독 4회독 5회독
V 8/1      

 

 

(+ 8/1 2회독)

스택에 수열의 값이 아닌 인덱스 저장하기


(참고)

✔ Do it 알고리즘 코딩테스트 자바편

 

반응형