백준/5001 - 10000
[백준] 6549번 : 히스토그램에서 가장 큰 직사각형
lms0806
2024. 12. 15. 21:25
728x90
https://www.acmicpc.net/problem/6549
유명한 스택으로 풀리는 문제입니다.
스택에 이전 값들을 저장해두면서, (현재 index - 이전 index) * 이전값이 가장 큰 값을 구하는 문제입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
if(n == 0) {
break;
}
long[] arr = new long[n + 1];
for(int i = 0; i < n; i++) {
arr[i] = Long.parseLong(st.nextToken());
}
long answer = 0;
Stack<Node> stack = new Stack<>();
for(int i = 0; i <= n; i++) {
int idx = i;
while(!stack.isEmpty() && stack.peek().num >= arr[i]) {
idx = stack.peek().idx;
answer = Math.max(answer, (i - idx) * stack.pop().num);
}
stack.add(new Node(idx, arr[i]));
}
sb.append(answer).append("\n");
}
System.out.print(sb);
}
}
class Node {
int idx;
long num;
public Node(int idx, long num) {
this.idx = idx;
this.num = num;
}
}
728x90