๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

๋ฐฑ์ค€ 6549๋ฒˆ : ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜• | JAVA

by Yunny52 2023. 4. 9.

ํ”Œ๋ž˜ํ‹ฐ๋„˜ 5

 

 

๐Ÿ“Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

์–ด๋ ค์› ๋˜ ์ด ๋ฌธ์ œ ,,, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์—ฌ๋Ÿฌ ํ’€์ด ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ๋ฆฐ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ถ„ํ• ์ •๋ณต์ด๋‚˜ ์Šคํƒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ ๋‚˜๋Š” ๊ตฌ๊ฐ„ ๋‚ด ๊ฐ€์šด๋ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ํ’€์ด ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค. 

 


๐Ÿ“Œ ํ’€์ด

๊ฐ€์šด๋ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํ’€์ดํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ๊ฐ€์šด๋ฐ ์œ„์น˜๋ฅผ ๊ตฌํ•œ๋‹ค.

2. ๊ฐ€์šด๋ฐ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์™ผ์ชฝ ๊ตฌ๊ฐ„์˜ ๋„“์ด์™€ ์˜ค๋ฅธ์ชฝ ๊ตฌ๊ฐ„์˜ ๋„“์ด๋ฅผ ๊ตฌํ•œ๋‹ค.

3. ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ค‘ ํฐ ๋„“์ด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

4. ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋„“์ด์™€ ๋‘ ๊ตฌ๊ฐ„์„ ํ•ฉ์นœ ๊ตฌ๊ฐ„์˜ ๊ฐ€์žฅ ํฐ ๋„“์ด๋ฅผ ๊ตฌํ•ด ๋‘ ๊ฐœ ์ค‘ ๊ฐ€์žฅ ํฐ ๋„“์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 


๐Ÿ“Œ ์ฝ”๋“œ

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

public class Main {

    static int[] histogram;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb= new StringBuilder();

        int n;
        while(true) {
            st = new StringTokenizer(br.readLine(), " ");
            n = Integer.parseInt(st.nextToken());

            if(n == 0)
                break;

            histogram = new int[n];

            for(int i = 0; i < n; i++) {
                histogram[i] = Integer.parseInt(st.nextToken());
            }
            sb.append(getArea(0, n-1)).append('\n');
            histogram = null;
        }

        System.out.println(sb);

    }

    public static long getArea(int lo, int hi) {

        // ๋ง‰๋Œ€ ํญ์ด 1์ผ ๊ฒฝ์šฐ
        if(lo == hi)
            return histogram[lo];

        // ๊ฐ€์šด๋ฐ ์œ„์น˜ ๊ตฌํ•˜๊ธฐ
        int mid = (lo + hi) / 2;

        // ๊ฐ€์šด๋ฐ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์™ผ์ชฝ ๊ตฌ๊ฐ„ ๋„“์ด์™€ ์˜ค๋ฅธ์ชฝ ๊ตฌ๊ฐ„ ๋„“์ด ๊ตฌํ•˜๊ธฐ
        long leftArea = getArea(lo, mid);
        long rightArea = getArea(mid+1, hi);

        // ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ค‘ ํฐ ๋„“์ด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ธฐ
        long max = Math.max(leftArea, rightArea);

        // ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋„“์ด์™€ ๋‘ ๊ตฌ๊ฐ„์„ ํ•ฉ์นœ ๊ตฌ๊ฐ„์˜ ๊ฐ€์žฅ ํฐ ๋„“์ด๋ฅผ ๊ตฌํ•ด ๋‘ ๊ฐœ ์ค‘ ๊ฐ€์žฅ ํฐ ๋„“์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
        max = Math.max(max, getMidArea(lo, hi, mid));

        return max;

    }

    public static long getMidArea(int lo, int hi, int mid) {

        int toLeft = mid; // ์ค‘๊ฐ„์ง€์ ์œผ๋กœ๋ถ€ํ„ฐ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ๋ณ€์ˆ˜
        int toRight = mid; // ์ค‘๊ฐ„์ง€์ ์œผ๋กœ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ๋ณ€์ˆ˜

        long height = histogram[mid]; // ๋†’์ด

        // ์ดˆ๊ธฐ ๋„“์ด
        long maxArea = height;

        // ์–‘๋ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
        while(lo < toLeft && toRight < hi) {

            // ์–‘์ชฝ ๋‹ค์Œ์นธ์˜ ๋†’์ด ์ค‘ ๋†’์€ ๊ฐ’ ์„ ํƒ
            if(histogram[toLeft-1] < histogram[toRight+1]) {
                toRight++;
                height = Math.min(height, histogram[toRight]);
            }
            else {
                toLeft--;
                height = Math.min(height, histogram[toLeft]);
            }

            maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
        }

        // ์˜ค๋ฅธ์ชฝ ๊ตฌ๊ฐ„์„ ๋๊นŒ์ง€ ํƒ์ƒ‰ ๋ชปํ–ˆ๋‹ค๋ฉด ๋งˆ์ € ํƒ์ƒ‰
        while(toRight < hi) {
            toRight++;
            height = Math.min(height, histogram[toRight]);
            maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
        }

        // ์™ผ์ชฝ ๊ตฌ๊ฐ„์„ ๋๊นŒ์ง€ ํƒ์ƒ‰ ๋ชปํ–ˆ๋”ฐ๋ฉด ๋งˆ์ € ํƒ์ƒ‰
        while(lo < toLeft) {
            toLeft--;
            height = Math.min(height, histogram[toLeft]);
            maxArea = Math.max(maxArea, height*(toRight-toLeft+1));
        }

        return maxArea;

    }

}

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

 

6549๋ฒˆ: ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•

์ž…๋ ฅ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์ง์‚ฌ๊ฐํ˜•์˜ ์ˆ˜ n์ด ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ n ≤ 100,000) ๊ทธ ๋‹ค์Œ n๊ฐœ์˜ ์ •์ˆ˜ h1, ..., hn (0 ≤ hi ≤

www.acmicpc.net

 

 

๋Œ“๊ธ€