๋ฐฑ์ค€(boj)

[JAVA]17299 ์˜ค๋“ฑํฐ์ˆ˜(๊ณจ๋“œ3, ์Šคํƒ)

cons-ps 2023. 6. 12. 22:11

 ๐Ÿ“š ๋ฌธ์ œ  

 

17299๋ฒˆ: ์˜ค๋“ฑํฐ์ˆ˜

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

www.acmicpc.net

๐Ÿ” ์•„์ด๋””์–ด  

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ฐ„์ถ”๋ ค์„œ ๋งํ•˜๋ฉด ๊ฐ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ  i ๋ฒˆ์งธ ์ˆซ์ž์˜ ์˜ค๋ฅธ์ชฝ์— arr๋‚ด์˜ i๊ฐ€ ์žˆ๋Š” ์ˆซ์ž๋ณด๋‹ค ๋” ๋งŽ์€ ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.  

 

arr : ์ž…๋ ฅ ์ˆซ์ž ๋ฐฐ์—ด

dp(numCnt) : ๊ฐ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜

stack<int[]> -> int[3] = {์ธ๋ฑ์Šค, ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ˆซ์ž, arr ๋‚ด์˜ ํ•ด๋‹น ์ˆซ์ž์˜ ๊ฐœ์ˆ˜) //์•„๋ž˜ ํ’€์ด์—์„œ๋Š” [2]๋ฒˆ์งธ ๊ฒƒ์„ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.

ans : ๊ฒฐ๊ณผ

์Šคํƒ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ stack์˜ peek์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ํ•ด๋‹น ์ธ๋ฑ์Šค์— ํ˜„์žฌ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” ์Šคํƒ์€ ์Œ“์ด๋Š” ์ˆœ์„œ๋กœ ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

๐Ÿ“ ํ’€์ด 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class boj_17299_์˜ค๋“ฑํฐ์ˆ˜2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int size = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());

        int[] arr = new int[size + 1];
        int[] numCnt = new int[1_000_001];
        
        //์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค (๊ธฐ์ˆ˜ ์ •๋ ฌ๊ณผ ๊ฐ™์•„ bucket์— ๋‹ด๋Š” ๋ฐฉ๋ฒ•)
        for (int i = 1; i <= size; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            numCnt[arr[i]]++;
        }

        Stack<int[]> stack = new Stack<>();
        int[] ans = new int[size + 1];
        for (int i = 1; i <= size; i++) {
            int[] temp = new int[]{i, arr[i]}; //์ธ๋ฑ์Šค, ํ•ด๋‹น ์ˆซ์ž
            while (!stack.isEmpty() && numCnt[stack.peek()[1]] < numCnt[temp[1]]) { 
                //๊ฐœ์ˆ˜๊ฐ€ ๋” ๋งŽ์€ ์ˆซ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ๊ฐ’์— ๋”ฐ๋ผ ์•ž์˜ ์ธ๋ฐ์Šค๋ฅผ ์ฑ„์›Œ์ค€๋‹ค.
                int[] pop = stack.pop();
                ans[pop[0]] = temp[1]; //ans[๊ฐ€๋Šฅ idx] = arr[i]
            }
            stack.push(temp);
        }

        for (int i = 1; i <= size; i++) {
            sb.append(ans[i] == 0 ? -1 : ans[i]).append(" "); //์ฑ„์›Œ์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ -1
        }
        System.out.println(sb);
    }
}

ํ•ด๋‹น ํ’€์ด๋Š” 996ms๋ฅผ ์†Œ์š”ํ–ˆ๊ณ  

 

ํ•˜๋‹จ์˜ ํ’€์ด๋Š” 992ms๋ฅผ ์†Œ์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ

์ฐจ์ด์ ์€ stack์— ์ธ๋ฑ์Šค, ์ˆซ์ž, ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋„ฃ์–ด ์‰ฝ๊ฒŒ ์‰ฝ๊ฒŒ ๋น„๊ตํ•˜์˜€์Šต๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋” ๋†’์€๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class boj_17299_์˜ค๋“ฑํฐ์ˆ˜ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int size = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());

        int[] arr = new int[size + 1];
        int[] dp = new int[1_000_001];
        for (int i = 1; i <= size; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            dp[arr[i]]++;
        }

        Stack<int[]> stack = new Stack<>();
        int[] ans = new int[size + 1];
        for (int i = 1; i <= size; i++) {
            int[] temp = new int[]{i, arr[i], dp[arr[i]]}; //์ธ๋ฑ์Šค, ์ˆซ์ž, ์ˆซ์ž์˜ ๊ฐœ์ˆ˜
            while (!stack.isEmpty() && stack.peek()[2] < temp[2]) {
                int[] pop = stack.pop();
                ans[pop[0]] = temp[1]; //ans[๊ฐ€๋Šฅ idx] = arr[i]
            }
            stack.push(temp);
        }

        for (int i = 1; i <= size; i++) {
            sb.append(ans[i] == 0 ? -1 : ans[i]).append(" ");
        }
        System.out.println(sb);

    }
}