01
07

โ–ถ ์œ ํ˜•

  • ๋ชจ๋…ธํ†ค ์Šคํƒ์€ ์Šคํƒ์˜ ์š”์†Œ๋“ค์ด ํ•ญ์ƒ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹จ์กฐ ๊ฐ์†Œํ•˜๋„๋ก ์œ ์ง€๋˜๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์กฐ ์Šคํƒ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • ๋ชจ๋…ธํ†ค ์Šคํƒ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํŠน์ •ํ•œ ํŒจํ„ด์„ ๊ฐ€์ง„ ๋‹ค์Œ/์ด์ „ ์›์†Œ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ์„ ํ˜• ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ธ๋ฐ, ๊ฐ ์›์†Œ๋Š” ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์Šคํƒ์— ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— O(n^2)์ด ๋  ์ฝ”๋“œ๊ฐ€ O(n)์œผ๋กœ ์œ ์ง€๋œ๋‹ค., ์ด๊ฒŒ ์—„์ฒญ ํฐ ์žฅ์ ์ด๋‹ค.
  • ๋ฐฐ์—ด์—์„œ ๊ฐ ์›์†Œ์˜ ๋‹ค์Œ์œผ๋กœ ํฐ ์ˆ˜ ์ฐพ๊ธฐ, ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜• ๋„“์ด ๊ตฌํ•˜๊ธฐ, ์˜จ๋„๊ฐ€ ๋” ๋†’์•„์ง€๋Š” ๋‚ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ผ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ ๊ฐ™์€ ์œ ํ˜•์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
flowchart TD
    Start([์‹œ์ž‘]) --> Init[์Šคํƒ ์ดˆ๊ธฐํ™”]
    Init --> InputCheck{์ƒˆ๋กœ์šด ์›์†Œ๊ฐ€<br>์žˆ๋Š”๊ฐ€?}
    
    InputCheck -->|Yes| StackEmpty{์Šคํƒ์ด<br>๋น„์–ด์žˆ๋Š”๊ฐ€?}
    InputCheck -->|No| End([์ข…๋ฃŒ])
    
    StackEmpty -->|Yes| PushElement[์Šคํƒ์— ์›์†Œ ์ถ”๊ฐ€]
    StackEmpty -->|No| CompareTop{์Šคํƒ top๊ณผ ๋น„๊ต}
    
    CompareTop -->|์กฐ๊ฑด ์œ„๋ฐฐ| PopElement[์Šคํƒ์—์„œ<br>top ์›์†Œ ์ œ๊ฑฐ]
    CompareTop -->|์กฐ๊ฑด ๋งŒ์กฑ| PushElement
    
    PopElement --> ProcessPopped[์ œ๊ฑฐ๋œ ์›์†Œ๋กœ<br>๊ฒฐ๊ณผ๊ฐ’ ๊ณ„์‚ฐ]
    ProcessPopped --> CompareTop
    
    PushElement --> InputCheck

โ–ถ ์ „๋žต

์˜ค๋ฆ„์ฐจ์ˆœ์ด๋ฉด ๋“ค์–ด๊ฐ€๋ ค๋Š” ์ˆ˜๊ฐ€ top ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ pop์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋ฉด ๋“ค์–ด๊ฐ€๋ ค๋Š” ์ˆ˜๊ฐ€ top ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ pop์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ตฌํ˜„๋œ๋‹ค.

[2, 1, 4, 3, 5]๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

๋จผ์ € 2๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ทธ ๋‹ค์Œ 1์ด ๋“ค์–ด์˜ค๋Š”๋ฐ, 1์€ 2๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 2๋ฅผ popํ•˜๊ณ  1์„ pushํ•œ๋‹ค. push ์ „์— top๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

 

4๋Š” 1๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ pushํ•˜๊ณ , 3์ด ๋“ค์–ด์™€์•ผ๋˜๋Š”๋ฐ 3์€ 4๋ณด๋‹ค ์ž‘์œผ๋‹ˆ๊นŒ 4์„ pop ํ•˜๊ณ  3์„ pushํ•œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ ์ž…๋ ฅ ๋ฐฐ์—ด์ด [2, 3, 5, 1] ์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

5๊นŒ์ง€ ๋‹ด์•˜์„ ๋•Œ 1๊ณผ ๋น„๊ตํ•˜๋ฉด 5๊ฐ€ pop๋˜์•ผํ•œ๋‹ค. ์—ฌ์ „ํžˆ top์ด 1๋ณด๋‹ค ํฌ๋ฏ€๋กœ 3๋„ pop, 2๋„ popํ•˜๋ฉด ์Šคํƒ์ด ๋นˆ ์ƒํƒœ๋กœ 1์ด push ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ ์Šคํƒ์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ๊ธฐ ์ „์— k ์ด์ƒ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  k๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

 

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

์–˜๋ฅผ ํ•œ๋ฒˆ ํ’€์–ด๋ณด์ž.

for (int i = 1; i <= n; i++) {
    // ํ˜„์žฌ ๋ง‰๋Œ€(arr[i])๋ณด๋‹ค ํฐ ๋†’์ด์˜ ๋ง‰๋Œ€๋“ค์„ ์ฒ˜๋ฆฌ
    while (!st1.isEmpty()) {
        if (st1.peek() > arr[i]) {
            long nowVal = st1.pop();     // ํ˜„์žฌ ์ฒ˜๋ฆฌํ•  ๋†’์ด
            st2.pop();                   // ํ•ด๋‹น ๋†’์ด์˜ ์œ„์น˜๋„ ํ•จ๊ป˜ ์ œ๊ฑฐ
  
            // ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ๊ฒฝ๊ณ„ ์ฐพ๊ธฐ
            int leftIdx = -1;
            if (st2.isEmpty())
                leftIdx = 1;             // ์Šคํƒ์ด ๋น„์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ
            else
                leftIdx = st2.peek() + 1; // ์ด์ „ ๋ง‰๋Œ€ ๋‹ค์Œ ์œ„์น˜๋ถ€ํ„ฐ
            
            // ์ง์‚ฌ๊ฐํ˜•์˜ ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„๋Š” ํ˜„์žฌ ์œ„์น˜ ์ง์ „๊นŒ์ง€
            int rightIdx = i - 1;
            
            // ๋„“์ด ๊ณ„์‚ฐ
            long width = rightIdx - leftIdx + 1;
            long area = width * nowVal;
            
            max = Math.max(max, area);
        } else {
            break;  // ํ˜„์žฌ ๋ง‰๋Œ€๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋†’์ด๋ฅผ ๋งŒ๋‚˜๋ฉด ์ค‘๋‹จ
        }
    }
    
    // ํ˜„์žฌ ๋ง‰๋Œ€์˜ ์ •๋ณด๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€
    st1.push(arr[i]);
    st2.push(i);
}

๋ฉ”์ธ ๋กœ์ง์ด๋‹ค.

์ž…๋ ฅ ๊ฐ’๊ณผ top์„ ๋น„๊ตํ•˜๋Š”๋ฐ, top์ด ๋” ํฌ๋ฉด popํ•˜๊ณ , idx๋ฅผ ๋“ค๊ณ ์žˆ๋˜ ์Šคํƒ๋„ popํ•œ๋‹ค.(๋™๊ธฐํ™”)

์ง€๊ธˆ ์Šคํƒ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด ์ง์‚ฌ๊ฐํ˜•์˜ ๋†’์ด๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ธ๋ฑ์Šค์˜ ์ฐจ์ด๋งŒํผ์ด ๋„ˆ๋น„๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ pop๋˜๋Š” ์‹œ์ ์˜ ๋ฐ”๋กœ ์ด์ „ ์ธ๋ฑ์Šค๊ฐ€ top์ด ์œ ์ง€๋˜๊ณ ์žˆ๋Š” ์ธ๋ฑ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๋„ˆ๋น„๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋๋‚œ๋‹ค. ๋ฌผ๋ก  ์ด ์ž‘์—… ํ›„์—, ์•„์ง ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์„ ๋น„์›Œ์ฃผ๋Š” ์ž‘์—…๋„ ํ•„์ˆ˜๋‹ค. ๊ทผ๋ฐ ์ด๋ฏธ ํƒ์ƒ‰์„ ๋ชจ๋‘ ํ•œ ์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ฅธ์ชฝ ๋์„ n์œผ๋กœ ์žก๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

// ๋‚จ์€ ์Šคํƒ ์ •๋ฆฌ
while (!st1.isEmpty()) {
    Long nowVal = st1.pop();
    st2.pop();
    int rightIdx = n; // ์˜ค๋ฅธ์ชฝ ๋
    int leftIdx = -1;
    if (st2.isEmpty()) {
        leftIdx = 1;
    } else {
        leftIdx = st2.peek() + 1;
    }
    long width = rightIdx - leftIdx + 1;
    long area = width * nowVal;
    max = Math.max(max, area);
}

 

์ด ๋ฌธ์ œ๋Š” ๋‹จ์กฐ ์ฆ๊ฐ€๋กœ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ์—์„œ ๋‹จ์กฐ ์ฆ๊ฐ€, ๊ฐ์†Œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‹จ์กฐ์ฆ๊ฐ€์™€ ๋‹จ์กฐ๊ฐ์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํ•ต์‹ฌ์€ "์š”๊ตฌ์‚ฌํ•ญ"์— ๋‹ฌ๋ ค์žˆ๋‹ค.
๋จผ์ € ๊ฒฐ๊ณผ๊ฐ’์˜ ์กฐ๊ฑด์„ ํŒŒ์•…ํ•ด์•ผํ•œ๋‹ค. ์ฐพ๋Š” ๊ฐ’์ด "๋” ํฐ ์ˆ˜"์ธ์ง€ "๋” ์ž‘์€ ์ˆ˜" ์ธ์ง€ ๊ตฌ๋ถ„ํ•ด์•ผ๋œ๋‹ค.

  • "๋” ํฐ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ → ๋‹จ์กฐ๊ฐ์†Œ ์Šคํƒ ์œ ์ง€
  • "๋” ์ž‘์€ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ → ๋‹จ์กฐ์ฆ๊ฐ€ ์Šคํƒ ์œ ์ง€

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,

https://www.acmicpc.net/problem/2493 
ํƒ‘ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด, ์ด์ „ ์Šคํƒ์— ๋” ํฐ ์ˆ˜๊ฐ€ ์ˆ˜์‹  ๊ธฐ๋‘ฅ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์กฐ๊ฐ์†Œ ์Šคํƒ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
    public static int[] input;
    public static ArrayDeque<Integer> stack;
    public static ArrayDeque<Integer> idx; // idx
    public static int n;
    public static int[] res;

    public static void main(String[] args) throws Exception {
        // System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());
        input = new int[n + 1];
        res = new int[n + 1]; // idx ๋ฒˆ ๊ธฐ๋‘ฅ์ด ์ˆ˜์‹ ํ–ˆ์Œ์„ ๊ธฐ๋กํ•˜๋ ค๊ณ 
        // idx ๊ณ„์‚ฐ 1๋ถ€ํ„ฐ
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 1; i <= n; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }
        // ์ž…๋ ฅ ๋
        stack = new ArrayDeque<>();
        idx = new ArrayDeque<>();
        go();
        for (int i=1; i<=n; i++){
            sb.append(res[i]).append(" ");
        }
        System.out.println(sb);
    }

    public static void go() {
        for (int i = 1; i <= n; i++) {
            // ๋‹จ์กฐ ๊ฐ์†Œ ์Šคํƒ์œผ๋กœ ๊ฐ€๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
            int now = input[i];
            while (!stack.isEmpty()) {
                if (stack.peek() < now) { // top์ด ๋” ์ž‘์œผ๋ฉด ๋นผ์•ผ๋œ๋‹ค
                    stack.pop();
                    idx.pop();
                } else {
                    // ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ˆ˜์‹ ํ•œ ๊ฒƒ
                    res[i] = idx.peek();
                    break;
                }
            }
            stack.push(now);
            idx.push(i);
        }
    }
}

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!
๋ฐ˜์‘ํ˜•
COMMENT