Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 이분 탐색
- 크루스칼
- 순열
- 그리디
- SSAFY
- Knapsack
- DP
- 피보나치 수
- 조합
- dfs
- lis
- 시뮬레이션
- MST
- 클래스
- 완전 탐색
- 분할 정복
- 문자열
- 우선순위 큐
- 큐
- BeautifulSoup
- 재귀
- 중복 순열
- 메모리풀
- 빠른 입출력
- 스택
- 링크드리스트
- 세그먼트 트리
- 비트마스크
- 백트래킹
- BFS
Archives
- Today
- Total
작심 24/7
[백준] 1725번 히스토그램 본문
1725번: 히스토그램
문제 히스토그램에 대해서 알고 있는가? 히스토그램은 아래와 같은 막대그래프를 말한다. 각 칸의 간격은 일정하고, 높이는 어떤 정수로 주어진다. 위 그림의 경우 높이가 각각 2 1 4 5 1 3 3이다. �
www.acmicpc.net
입력을 받을 때마다 stack의 top과 값을 비교해준다
1. top <= 입력값(height)
이전 사각형이 계속 이어질 수 있는 상태이기 때문에
그냥 stack에 입력값을 push하여 현재 사각형을 시작한다.
2. top > 입력값(height)
이전 사각형이 더이상 지속될 수 없는 상태이기 때문에
stack이 empty가 되거나 top <= 입력값(height) 이 될 때까지 push해준다.
stack에 입력값을 push해줄 때 하나 더 고려해줘야 할 사항이 있다.
바로 가로길이인 width이다.
그냥 현재 index값을 현재 사각형의 시작 위치로 저장해주면
이렇게 현재 위치에서부터만 시작되므로 최대 사각형을 구하지 못한다.
그래서 top > 입력값(height) 이라 pop해줄 때
pop되는 이전 사각형의 시작 위치의 값을 가져와 현재 사각형의 시작 위치로 넣어주면
이렇게 최대 직사각형을 찾을 수 있다.
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int main() {
int N;
cin >> N;
stack <int> histogram, start;
int Max = -1, height, temp;
histogram.push(0), start.push(0);
for (int i = 0; i < N; i++) {
cin >> height;
temp = i;
while (!histogram.empty() && histogram.top() > height) { //이전 사각형이 지속 가능한 상태가 될 때까지 pop
Max = max(Max, histogram.top()*(i - start.top()));
histogram.pop();
temp = start.top(); //현재 사각형의 시작 인덱스는 이전에 시작된 걸로 볼 수 있다
start.pop();
}
histogram.push(height); //현재 사각형 시작
start.push(temp); //현재 사각형의 시작 인덱스 넣어줌
}
while (!histogram.empty()) {
Max = max(Max, histogram.top()*(N - start.top()));
histogram.pop();
start.pop();
}
cout << Max;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 2841번 외계인의 기타 연주 (0) | 2020.06.05 |
---|---|
[백준] 2304번 창고 다각형 (4) | 2020.06.05 |
[백준] 1918번 후위 표기식 (0) | 2020.06.04 |
[백준] 5430번 AC (0) | 2020.06.04 |
[백준] 3078번 좋은 친구 (0) | 2020.06.03 |
Comments