Algorithm & Data Structures/BOJ

b.1725 ํžˆ์Šคํ† ๊ทธ๋žจ

Geisha 2025. 2. 6. 21:59

 

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

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜• ๋ฌธ์ œ ํ’€์ด

๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

์ด ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€ "ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜• (1725๋ฒˆ)" ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

7
2
1
4
5
1
3
3

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

8

์œ„ ์ž…๋ ฅ์— ๋Œ€ํ•œ ํžˆ์Šคํ† ๊ทธ๋žจ์„ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋•Œ, ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋Š” 8์ž…๋‹ˆ๋‹ค.


๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ(Stack) ์„ ํ™œ์šฉํ•œ O(N) ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ

  1. ๊ฐ ํžˆ์Šคํ† ๊ทธ๋žจ ๋ง‰๋Œ€์˜ ๋†’์ด(h)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์Šคํƒ์—๋Š” ํ•ญ์ƒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ €์žฅํ•˜์—ฌ, ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ๋‚ฎ์•„์ง€๋Š” ๊ฒฝ์šฐ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์Šคํƒ์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๋‚จ์€ ๋†’์ด๋“ค์— ๋Œ€ํ•œ ๋„“์ด๋„ ์ตœ์ข…์ ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น Java ์ฝ”๋“œ ํ•ด์„ค

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

public class b1725 {

    static int N;             // ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ๋ง‰๋Œ€ ๊ฐœ์ˆ˜
    static long answer;       // ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด
    static Stack<int[]> stack; // ๋†’์ด์™€ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํƒ

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine()); // ๋ง‰๋Œ€ ๊ฐœ์ˆ˜ ์ž…๋ ฅ
        stack = new Stack<>();
        answer = 0;

        for (int i = 0; i < N; i++) {
            int num = Integer.parseInt(br.readLine()); // ํ˜„์žฌ ๋ง‰๋Œ€ ๋†’์ด ์ž…๋ ฅ
            int start = i;  // ๋ง‰๋Œ€๊ฐ€ ์‹œ์ž‘๋œ ์œ„์น˜

            // ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๋†’์ด๊ฐ€ ๋‚˜์˜ค๋ฉด ๋„“์ด ๊ณ„์‚ฐ
            while (!stack.isEmpty() && stack.peek()[0] > num) {
                int[] top = stack.pop();
                answer = Math.max(answer, (long) top[0] * (i - top[1]));
                start = top[1]; // ์‹œ์ž‘ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
            }

            stack.push(new int[]{num, start}); // ํ˜„์žฌ ๋ง‰๋Œ€ ์ €์žฅ
        }

        // ์Šคํƒ์— ๋‚จ์•„ ์žˆ๋Š” ๋†’์ด๋“ค์— ๋Œ€ํ•œ ๋„“์ด ๊ณ„์‚ฐ
        while (!stack.isEmpty()) {
            int[] top = stack.pop();
            answer = Math.max(answer, (long) top[0] * (N - top[1]));
        }

        System.out.println(answer); // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

๐Ÿ“Œ 1. ์Šคํƒ ํ™œ์šฉํ•œ ๋„“์ด ๊ณ„์‚ฐ

static Stack<int[]> stack;
  • ์Šคํƒ์—๋Š” {๋†’์ด, ์‹œ์ž‘ ์œ„์น˜} ์Œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋‚ฎ์•„์ง€๋Š” ๊ฒฝ์šฐ ์Šคํƒ์„ ๋น„์šฐ๋ฉด์„œ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 2. ํ˜„์žฌ ๋†’์ด๊ฐ€ ๊ธฐ์กด ์Šคํƒ๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ๋„“์ด ๊ณ„์‚ฐ

while (!stack.isEmpty() && stack.peek()[0] > num) {
    int[] top = stack.pop();
    answer = Math.max(answer, (long) top[0] * (i - top[1]));
    start = top[1]; // ์‹œ์ž‘ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
}
  • ํ˜„์žฌ ๋†’์ด๊ฐ€ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ๋ณด๋‹ค ๋‚ฎ๋‹ค๋ฉด, ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•จ
  • ๋„“์ด ๊ณ„์‚ฐ ๊ณต์‹:
    ํ˜„์žฌ ๋ง‰๋Œ€ ๋†’์ด * (ํ˜„์žฌ ์ธ๋ฑ์Šค - ์ €์žฅ๋œ ์‹œ์ž‘ ์ธ๋ฑ์Šค)
    
  • ์Šคํƒ์˜ ๋†’์ด๊ฐ€ ๋‚ฎ์•„์งˆ ๋•Œ๊นŒ์ง€ pop()ํ•˜๋ฉด์„œ ๋„“์ด๋ฅผ ๊ฐฑ์‹ 

๐Ÿ“Œ 3. ์Šคํƒ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฐ’ ์ฒ˜๋ฆฌ

while (!stack.isEmpty()) {
    int[] top = stack.pop();
    answer = Math.max(answer, (long) top[0] * (N - top[1]));
}
  • ๋ฐฐ์—ด์˜ ๋๊นŒ์ง€ ๊ฐ”์„ ๋•Œ, ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์€ ๊ฐ’๋“ค์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋„“์ด ๊ณต์‹:
    ๋†’์ด * (์ „์ฒด ๊ธธ์ด - ์‹œ์ž‘ ์œ„์น˜)
    

๐Ÿ”ฅ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์—ฐ์‚ฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ํšŸ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„
for ๋ฃจํ”„ N O(N)
while ๋ฃจํ”„ (์Šคํƒ์—์„œ pop) N O(N)
while ๋ฃจํ”„ (๋งˆ์ง€๋ง‰ ์ฒ˜๋ฆฌ) N O(N)
์ดํ•ฉ O(N)  

๐Ÿ“Œ ๊ฒฐ๋ก 
๐Ÿ‘‰ ๋ชจ๋“  ์—ฐ์‚ฐ์ด O(N) ์ด๋‚ด๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.


๐Ÿ† ์ •๋ฆฌ

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

  1. ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ๋„“์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.
  2. ๋†’์ด๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ์ˆœ๊ฐ„ ์Šคํƒ์„ ๋น„์šฐ๋ฉด์„œ ์ง์‚ฌ๊ฐํ˜• ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  3. ๋ฐฐ์—ด์˜ ๋๊นŒ์ง€ ๊ฐ”์„ ๋•Œ, ๋‚จ์€ ์Šคํƒ์„ ํ•œ ๋ฒˆ ๋” ์ฒดํฌํ•œ๋‹ค.
  4. ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(N)์œผ๋กœ ์ตœ์ ํ™”ํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•œ๋‹ค.

๐ŸŽฏ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์žฅ์ 

โœ” ์Šคํƒ์„ ํ™œ์šฉํ•œ O(N) ํ’€์ด๋กœ ํšจ์œจ์ 
โœ” ์ง์‚ฌ๊ฐํ˜• ๋„“์ด๋ฅผ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โœ” ๋‹ค๋ฅธ "Largest Rectangle" ๋ฌธ์ œ์—์„œ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ


์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด, ์ข‹์•„์š”์™€ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ˜Š