Algorithm/baekjoon

히스토그램==========

마닐라 2022. 1. 30. 20:58

📍 문제 설명

💡 접근

현재 막대가 이전 길이의 막대보다 작을 때 넓이를 구해줘야 한다.

 

1.현재 막대 높이보다 크거나 같은 막대를 만나면 모두 pop 해준다.

2.pop할 때 높이와 폭을 계산해서 넓이를 구해준다.

3.현재 막대를 push 한다.

4.현재 막대가 이전 길이의 막대와 같거나 클 수 있으므로 남아있는 넓이들도 계산해줘야한다.

 

스택에는 인덱스를 기준으로 넣었지만 값들을 기준으로 한다.

i = 0일 때 push 한다. [2]
i = 1일 때 2를 pop 한다. []

넓이를 구한다. 높이 2 폭 1 -> 2 -> 비어있을 땐 i가 폭

현재 높이 push 한다. [1]

 

i = 2일 때 push 한다. [1,4]

i = 3일 때 push 한다. [1,4,5]


i = 4일 때 1,4,5를 pop 한다.

각각 pop시킬 때 넓이를 구한다.

코드 상에서는 스택에 막대의 번호를 넣어놨으니 폭은 i - 1 - s.peek()이 된다.

5일 때 높이 5 폭 (4-1-2) 1 -> 5 [1,4] 

4일 때 높이 4 폭 (4-1-1) 2 -> 8 [1]

1일 때 높이 1 폭 4 -> 4 [] -> 비어있을 땐 i가 폭

 

 

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, answer = Integer.MAX_VALUE;
    static int[][] board;
    static boolean[][] visited;
    static int[] histogram;
    static int[] dx = {-1, 0, 1, 0,}; //북동남서
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        n = kb.nextInt();
        histogram = new int[n];
        for(int i = 0; i < n; i++) {
            histogram[i] = kb.nextInt();
        }

        System.out.println(T.solution());
    }

    private long solution() {
        Stack<Integer> s = new Stack<>();
        //높이의 최댓값은 1,000,000,000
        long max = 0;

        //모든 막대 확인
        //i = 4일 때
        //h[3]에서의 넓이는 height 5 width 1(4-1-2) -> 5
        //h[2]에서의 넓이는 height 4 width 2(4-1-1) -> 8
        //h[1]에서의 넓이는 height 1 width 4(4)  -> 4
        for(int i = 0; i < n; i++) {
            //현재 막대의 높이 보다 크거나 같은 막대들은 모두 pop 해준다.
            while(!s.isEmpty() && histogram[s.peek()] >= histogram[i]) {
                //pop 시킬 때 직사각형의 넓이를 구해야한다.
                int height = histogram[s.pop()];
                //비어있을 땐 i가 폭이 되고 아니라면 현재 인덱스 - 1 - 막대번호가 폭이 된다.
                long width = s.isEmpty() ? i : i - 1 - s.peek();

                max = Math.max(max, height * width);
            }
            //현재 막대는 무조건 push 해준다.
            s.push(i);
        }

        //아직 처리 안된 넓이들에 대해서도 처리해야한다.
        //n = 7
        //height 3 width 2(7-1-4) -> 6
        //height 1 width 7(7) -> 7
        while(!s.isEmpty()) {
            int height = histogram[s.pop()];

            long width = s.isEmpty()? n : n - 1 - s.peek();

            max = Math.max(max, height * width);
        }

        return max;
    }

}

'Algorithm > baekjoon' 카테고리의 다른 글

리모컨  (0) 2022.02.04
사탕 게임  (0) 2022.01.31
  (0) 2022.01.30
  (0) 2022.01.29
문자열 폭발  (0) 2022.01.28