본문 바로가기

ps(알고리즘)

히스토그램

직사각형들의 높이가 주어졌을 때 가장 큰 넓이의 직사각형을 구하면 된다.

두가지 풀이가 있는데 이번에는 스택을 이용해서 풀고 다음에 다른 풀이로 풀어보겠다.

 

스택을 이용해서 앞에서부터 높이를 하나씩 볼 때 새로 들어온 높이 값이 이전 높이보다 크면 스택에 높이를 넣어준다.

이전 높이보다 작으면 이전의 더 큰 높이들은 앞으로의 직사각형에 영향을 미치지 않기 때문에 지금 새로 들어온 높이보다 작아질 때까지 스택에서 pop을 해주면서 직사각형의 넓이들을 구한다.

#include<stdio.h>
#include<stack>
using namespace std;
int N;
long long ans=0;
long long arr[3000004];
stack<int> st;
int main()
{
    scanf("%d",&N);
    st.push(0);
    for(int i=1;i<=N+1;i++)
    {
        scanf("%lld",&arr[i]);
        if(st.empty()) st.push(i);
        else{
            if(arr[st.top()]<=arr[i])
            {
                st.push(i);
            }
            else
            {
                while(!st.empty() && arr[st.top()]>arr[i])
                {
                    int ind = st.top();
                    st.pop();
                    long long x = (i-st.top()-1)*arr[ind];
                    if(ans<x) ans = x;
                    if(st.empty()) break;
                }
                st.push(i);
            }
        }
    }
    printf("%lld",ans);
}

처음에 push 0을 하고 N+1번 반복문을 도는 이유는 N번 돌고 끝났을 때 스택에 높이들이 남아있으면 안되기 때문에 0을 하나 넣어놓고 모든 높이들에 대해 직사각형의 최대 넗이를 구하기 위해서이다.

'ps(알고리즘)' 카테고리의 다른 글

가장 긴 증가하는 부분 수열 5  (0) 2024.11.07
히스토그램에서 가장 큰 직사각형  (1) 2024.11.07
제곱 ㄴㄴ수  (0) 2024.11.04
외판원 순회  (0) 2024.11.04
최솟값과 최댓값  (0) 2024.10.30