6549 번과 동일하다. 6549는 long 으로 바꿔야한다.
[적용한 알고리즘]
스택
[아이디어]
https://www.acmicpc.net/blog/view/12
에서 아이디어를 얻었다. 이해하는데 오래 걸렸던 것 같다. 빡대가리라..
결국 모든 높이를 살피되, 항상 현재 자신의 왼쪽만 살펴 시간 복잡도를 확 줄인 것이다.
그걸 스택으로 구현한 것이고. 도대체 이런 생각을 어떻게 하는거지? 항상 벽을 느낀다.
[생각의 흐름 / 절차]
[교훈]
분할정복으로도 풀 수 있고, 스택으로도 풀 수 있다고한다.
원리를 제대로 이해하고 코드를 내 손으로 쓰기까지 더 연습해봐야겠다.
<코드>
#include <cstdio>
#include <stack>
#include <algorithm>
using namespace std;
int H[100001];
int main(){
int N; scanf("%d", &N);
for (int i = 0; i < N; i++){
scanf("%d", H + i);
}
stack<int> S;
int ans = -1;
for (int i = 0; i < N; i++){
while (!S.empty() && H[S.top()] > H[i]){
int height = H[S.top()];
int width = i;
S.pop();
if (!S.empty()){
width = (i - S.top() - 1);
}
ans = max(ans, width * height);
}
S.push(i);
}
while (!S.empty()){
int height = H[S.top()];
int width = N;
S.pop();
if (!S.empty()){
width = N - S.top() - 1;
}
ans = max(ans, width * height);
}
printf("%d\n", ans);
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 10282번 해킹 (0) | 2019.12.28 |
---|---|
[백준] 6118번 숨바꼭질 (0) | 2019.12.28 |
[백준] 1005번 ACM Craft (0) | 2019.12.26 |
[백준] 2623번 음악프로그램 (0) | 2019.12.26 |
[백준] 11657번 타임머신 (0) | 2019.11.29 |