Coding Test/Solution

[C++] 6549 - 히스토그램에서 가장 큰 직사각형 (플래티넘5)

나죽못고나강뿐 2023. 1. 4. 09:50

1. 문제 설명

 

 

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

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

www.acmicpc.net

 

1725번: 히스토그램

첫 행에는 N (1 ≤ N ≤ 100,000) 이 주어진다. N은 히스토그램의 가로 칸의 수이다. 다음 N 행에 걸쳐 각 칸의 높이가 왼쪽에서부터 차례대로 주어진다. 각 칸의 높이는 1,000,000,000보다 작거나 같은

www.acmicpc.net

테스트 케이스가 한 개 뿐인 동일한 티어의 문제가 또 있다.

경험치 2배 이벤트 댕꿀~

 

 

algospot.com :: FENCE

울타리 잘라내기 문제 정보 문제 너비가 같은 N개의 나무 판자를 붙여 세운 울타리가 있습니다. 시간이 지남에 따라 판자들이 부러지거나 망가져 높이가 다 달라진 관계로 울타리를 통째로 교체

algospot.com

참고로 이 문제랑 동일하다.


2. 아이디어

 

 

알고리즘 문제를 풀면서 생각해보아야 할 것들

이제 1년하고 1달 조금 넘게 코딩을 하면서, 알고리즘이라고는 실버 2주, 골드 1달, 플래티넘 1달 정도밖에 풀어보지 않은 짬밥에 뭘 얼마나 유용한 걸 설명할 수 있을 지는 모르겠지만 그래도 내

jaeseo0519.tistory.com

 

이 문제는 이전에 진득하게 다뤘으므로 위의 포스팅을 참조하면 된다.

값이 크기 때문에 시간 복잡도를 최소로 줄여야 하는데 스택과 스위핑 기법을 이용한다면

선형 시간 알고리즘으로 문제를 해결할 수 있다.

 

그런데 오랜만에 푸니까 또 헷갈려서 생각보다 제법 시간이 걸렸다.


3. 코드

 

#include <iostream>
#include <stack>

#define endl "\n"

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

ll calc_area(int n) {
    int idx = 0, height;
    ll w, h;
    ll max_area = 0;
    pii tmp;
    stack<pii> st; st.push(make_pair(0, -1)); // {y, x}

    while (idx <= n) {
        if (idx == n) height = 0; 
        else cin >> height;
         
        while (!st.empty() && st.top().first >= height) {
            tmp = st.top(); st.pop();

            h = tmp.first;
            w = (st.empty()) ? idx : idx - st.top().second - 1;

            max_area = max(max_area, (ll)w*h);
        }
        st.push(make_pair(height, idx));

        idx++;    
    }

    return max_area;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n; 

    while (true) {
        cin >> n;
        if (n == 0) break;
        cout << calc_area(n) << endl;
    }

    return 0;
}