1 minute read

๐Ÿ“Œ ๋‚œ์ด๋„

๐Ÿ’ง Platinum 5


๐Ÿ“Œ ๋ฌธ์ œ

https://www.acmicpc.net/problem/1725


image

image


๐Ÿ“Œ ํ’€์ด

์ €๋ฒˆ์— ์ฒ˜์Œ์œผ๋กœ ์†ŒํŠธ ๋ผ๋Š” ํ”Œ๋ ˆํ‹ฐ๋„˜ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๋‚˜์„œ 2๋ฒˆ์งธ๋กœ ๋„์ „ํ•ด๋ณด๋Š” ํ”Œ๋ ˆํ‹ฐ๋„˜ ๋ฌธ์ œ์˜€๋‹ค.

์ฒ˜์Œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๋“  ์ƒ๊ฐ์€ ์ด๊ฑฐ ์™„์ „ํƒ์ƒ‰ ๋ฌธ์ œ์ธ๊ฐ€? ๋ผ๋Š” ๋ฐœ์ƒ์ด์˜€๋‹ค.
์™œ๋ƒํ•˜๋ฉด ์ตœ๋Œ€ ๋„“์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์กฐ๊ฑด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ตฌํ•œํ›„, ๊ทธ ๊ฐ’๋“ค์„ max ์ณ์„œ ๊ตฌํ•ด์•ผ ํ•˜์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ƒ๊ฐ์ด์˜€๋‹ค.
๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ์ง€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ์ง€ ์•Š์„๊นŒ๋ผ๊ณ  ๊ณ ๋ฏผํ•˜์˜€๋‹ค.

์ผ๋‹จ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋‹ˆ n = 100000 ์ด๋ฏ€๋กœ o(nlog(n)) โ‰’ 20,000,000 (0.2์ดˆ) ๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ํ•œ์˜ ์‹œ๊ฐ„์ด์˜€๋‹ค.
๊ทธ๋ž˜์„œ for๋ฌธ ์„ ํ•œ๋ฒˆ ๋Œ๋ฆฌ๋ฉด์„œ ์•„๋ฌด๋ฆฌ ์ปค๋„ log(n) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ํƒ์ƒ‰์„ ํ•ด์•ผํ–ˆ๋‹ค.

์ด๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•˜๋˜ ์ฐจ์— Stack ์ด๋ผ๋Š” ํžŒํŠธ๋ฅผ ์–ป๊ณ  ๋‚˜์„œ ๊ฐ‘์ž๊ธฐ ์ƒ๊ฐ์ด ๋ฒˆ๋œฉ ๋“ค์—ˆ๋‹ค.
๋ฐ”๋กœ for(int i)๋ฌธ ์—์„œ 0~N๊นŒ์ง€ ๊ฐ€๋ฉด์„œ stack<Integer[]> ์— ๊ทธ ์œ„์น˜์—์„œ์˜ ๋†’์ด ์ฆ‰ value ๋ผ๋Š” ๋ณ€์ˆ˜์™€ i ๋ผ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค.
๋‹ค์Œ์— ์ƒˆ๋กœ stack์— ๊ฐ’์„ ์ง‘์–ด๋„ฃ์„๋•Œ ์ด์ „ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ๋†’์ด๊ฐ€ ๋” ๋†’์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์ง‘์–ด๋„ฃ๊ณ , ๋” ์ž‘์œผ๋ฉด ๋” ํฐ ๊ฐ’์ด ๋‚˜์˜ค๊ฑฐ๋‚˜ ๋นŒ ๋•Œ๊นŒ์ง€ ๋นผ๋ฉด์„œ ๋บ€ ๊ฐ’์˜ index๊ฐ’ ๊ณผ ํ˜„์žฌ index๊ฐ’ ์˜ ์ฐจ์ด์— ๋†’์ด๋ฅผ ๊ณฑํ•ด์„œ max๊ณผ Math.max ๋ฅผ ๊ณ„์‚ฐํ•ด ์ฃผ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  stack ์— ์ƒˆ๋กœ ๋„ฃ๋Š” ๊ฐ’์€ ๋บ€ ๊ฐ’์˜ index๊ฐ’ ์— value ๋ฅผ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.

์ดํ›„ ์ด ๋ชจ๋“  ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„ stack์—๋Š” ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ์ž‘์€ ๋†’์ด๊ฐ€ 1๊ฐœ๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ์€ ๊ฐ’๊ณผ n์„ ๊ณฑํ•œ๊ฐ’์„ max ์™€ ๋น„๊ตํ•ด์„œ ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ๋‹ค.

์ดํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.
ํ”Œ๋ ˆํ‹ฐ๋„˜ ๋ฌธ์ œ์ด์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ’€๋ ค์„œ ์ข‹์•˜๋‹ค. ๐Ÿ˜Ž


๐Ÿ“Œ Code

package BOJ.DS;

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

public class N1725 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        Stack<Integer[]> st = new Stack<>();
        int max = 0;
        st.add(new Integer[]{Integer.parseInt(br.readLine()), 0});
        for (int i = 1; i < N; i++) {
            int num = Integer.parseInt(br.readLine());
            if (num > st.peek()[0]) {
                st.add(new Integer[]{num, i});
            } else if (num == st.peek()[0]) {
                //์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•œ๋‹ค.
            } else {
                Integer[] arr = st.pop();
                max = Math.max(arr[0] * (i - arr[1]), max);
                while (!st.isEmpty() && num < st.peek()[0]) {
                    arr = st.pop();
                    max = Math.max(arr[0] * (i - arr[1]), max);
                }
                st.add(new Integer[]{num, arr[1]});
            }
        }
        while (!st.isEmpty()) {
            Integer[] arr = st.pop();
            max = Math.max(arr[0] * (N - arr[1]), max);
        }
        System.out.println(max);
    }
}

package (์ด๋ฆ„); ๋ฅผ ๋•Œ๊ณ , class ์ด๋ฆ„์„ Main์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.


๐Ÿ“Œ ์ถ”๊ฐ€ ์˜ˆ์ œ

[Input]
8
1
2
3
4
5
6
7
8

[Output]
20



๊ฐœ์ธ ๊ณต๋ถ€ ๊ธฐ๋ก์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ œ๋ณดํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ˜