관리 메뉴

민우의 코딩노트

6549번 히스토그램에서 가장 큰 직사각형 - C++ 본문

Algorithm/BOJ

6549번 히스토그램에서 가장 큰 직사각형 - C++

미미누 2022. 7. 25. 22:39

[문제]
https://www.acmicpc.net/problem/6549

6549번: 히스토그램에서 가장 큰 직사각형

입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤

www.acmicpc.net


[풀이]
1. 스택을 이용한 방법
최대 넓이를 구하기 위해서 스택의 top에 존재하는 높이 값이 현재 높이값보다 크거나 같을때까지 스택을 탐색하여 최대 넓이를 구한다.
스택에는 (삭제할때의 idx, 높이)를 저장하고, 스택에 저장하면 된다.
주의할 점은 0~n 까지 탐색할 경우 마지막에 넣은 높이의 넓이를 구할수 없으므로, S.empty()를 조사하여 최대 넓이를 구하도록 한다.

[코드]

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    while(1){
        int n;
        cin >> n;
        if(n == 0) break;
        long long ans = 0LL;
        stack<pair<int,int>> S;
        for(int i=0; i<n; i++){
            int h;
            int idx = i;
            cin >> h;
            while(!S.empty() && S.top().second >= h){
                ans = max(ans, 1LL * (i-S.top().first) * S.top().second);
                idx = S.top().first;
                S.pop();
            }
            S.push({idx, h});
    
        }
        while(!S.empty()){
            ans = max(ans, 1LL*(n-S.top().first)*S.top().second);
            S.pop();
        }
        cout << ans << "\n";
    }
}

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

2164번 카드2 - C++  (0) 2022.07.25
18258번 큐 2 - C++  (0) 2022.07.25
3015번 오아시스 재결합 - C++  (0) 2022.07.24
10773번 제로 - C++  (0) 2022.07.16
10828번 스택 - C++  (0) 2022.07.16