[백준 17299] 오등큰수(Java)

최민길(Gale)·2023년 12월 3일
1

알고리즘

목록 보기
163/172

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

이 문제는 스택을 이용하여 풀 수 있습니다.

https://velog.io/@gale4739/%EB%B0%B1%EC%A4%80-17298-%EC%98%A4%ED%81%B0%EC%88%98Java
백준 17298(오큰수) 문제와 굉장히 유사한 문제로 유사한 풀이과정을 보입니다.

오큰수 문제는 자기 자신보다 오른쪽에서 있으면서 큰 수 중 가장 왼쪽에 있는 수입니다. 따라서 스택에 인덱스를 저장하면서 오른쪽으로 계속 이동하다가 스택의 피크값보다 큰 값이 나타나게 된다면 스택 안에 저장되어 있는 인덱스의 값이 현재 값보다 클 때까지 현재 값으로 치환하빈다

다음은 코드입니다.

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

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] A = new int[N];
        int[] C = new int[1000001];
        int[] res = new int[N];
        for(int i=0;i<N;i++){
            A[i] = Integer.parseInt(st.nextToken());
            C[A[i]]++;
            res[i] = -1;
        }

        Stack<Integer> stack = new Stack<>();
        for(int i=0;i<N;i++){
            while(!stack.isEmpty() && C[A[stack.peek()]] < C[A[i]]){
                int idx = stack.pop();
                res[idx] = A[i];
            }

            stack.push(i);
        }

        StringBuilder sb = new StringBuilder();
        for(int i=0;i<N;i++) sb.append(res[i]).append(" ");
        System.out.println(sb);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글