Algorithm๐Ÿฅ‡

17299.์˜ค๋“ฑํฐ์ˆ˜

hae02y 2023. 10. 16. 08:23
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ N์ธ ์ˆ˜์—ด A = A1, A2, ..., AN์ด ์žˆ๋‹ค. ์ˆ˜์—ด์˜ ๊ฐ ์›์†Œ Ai์— ๋Œ€ํ•ด์„œ ์˜ค๋“ฑํฐ์ˆ˜ NGF(i)๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

Ai๊ฐ€ ์ˆ˜์—ด A์—์„œ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๋ฅผ F(Ai)๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, Ai์˜ ์˜ค๋“ฑํฐ์ˆ˜๋Š” ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด์„œ ์ˆ˜์—ด A์—์„œ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๊ฐ€ F(Ai)๋ณด๋‹ค ํฐ ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ์˜ค๋“ฑํฐ์ˆ˜๋Š” -1์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, A = [1, 1, 2, 3, 4, 2, 1]์ธ ๊ฒฝ์šฐ F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1์ด๋‹ค. A1์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด์„œ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๊ฐ€ 3๋ณด๋‹ค ํฐ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์—, NGF(1) = -1์ด๋‹ค. A3์˜ ๊ฒฝ์šฐ์—๋Š” A7์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด์„œ F(A3=2) < F(A7=1) ์ด๊ธฐ ๋•Œ๋ฌธ์—, NGF(3) = 1์ด๋‹ค. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 โ‰ค N โ‰ค 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ์— ์ˆ˜์—ด A์˜ ์›์†Œ A1, A2, ..., AN (1 โ‰ค Ai โ‰ค 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ด N๊ฐœ์˜ ์ˆ˜ NGF(1), NGF(2), ..., NGF(N)์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 512 MB 15049 6833 5265 44.740%
https://www.acmicpc.net/problem/17299

ํ’€์ด

์ฝ”๋“œ

public class ์˜ค๋“ฑํฐ์ˆ˜ {  

    /*  
    ๋“ฑ์žฅํšŸ์ˆ˜์— ๋”ฐ๋ผ์„œ..! ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด์„œ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๊ฐ€ An๋ณด๋‹ค ํฐ์ˆ˜์ค‘์— ๊ฐ€์žฅ์™ผ์ชฝ์— ์žˆ๋Š”์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.  
     */  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new  InputStreamReader(System.in));  
        Stack<Integer> stack = new Stack<>();  

        int N = Integer.parseInt(br.readLine());  
        int[] data = new int[N];  
        int[] count = new int[1000001]; //data ์ž…๋ ฅ์„ ๋ฐ›์€ ํ›„์— ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธ ํ•˜์—ฌ count๋ฅผ ๋งŒ๋“ค๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.  
        int[] answer = new int[N];  

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");  

        for(int i=0; i<N; i++){  
            data[i] =Integer.parseInt(st.nextToken());  
            count[data[i]]++;  
        }  

        for(int i=0; i<N; i++){  
            while (!stack.isEmpty() && count[data[stack.peek()]] < count[data[i]]){  
                answer[stack.pop()] = data[i];  
            }  
            stack.add(i);  
        }  

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


        StringBuilder sb = new StringBuilder();  

        for(int i=0; i<N; i++){  
            sb.append(answer[i]).append(" ");  
        }  

        System.out.println(sb);  
    }  
}
๋ฐ˜์‘ํ˜•