https://www.acmicpc.net/problem/12846
문제 설명 및 코드 설명은 생략하겠습니다.
왜냐하면, 가독성이 좋게 코드에 주석처리로 설명을 추가하였습니다.
import java.io.*;
import java.util.*;
public class Main {
// 12846 플레티넘 5, 무서운 아르바이트, stack 문제임.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] pay = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < n; i++) {
pay[i] = Integer.parseInt(st.nextToken());
}
System.out.print(getMaxMoney(pay));
}
private static long getMaxMoney(int[] pay) {
Stack<Integer> stack = new Stack<>();
long maxMoney = 0;
for (int i = 0; i <= pay.length; i++) {
// 스택이 비어있지 않고,
// i 가 배열의 총 길이와 같거나(stack에 있는 요소를 처리해야할 때)
// 또는 현재 스택의 맨 위 요소에 있는 인덱스의 값이 더 큰 경우
while (!stack.isEmpty() && (i == pay.length || pay[stack.peek()] > pay[i])) {
int poppedIndex = stack.pop(); // 스택에서 맨 위의 인덱스 제거
int height = pay[poppedIndex]; // 제거된 인덱스의 값(고려되는 타이어 세트 가격)
int leftIndex = stack.isEmpty() ? 0 : stack.peek() + 1; // 제거된 인덱스의 왼쪽 인덱스
int width = i - leftIndex; // 제거된 인덱스까지의 범위 길이
long calculatedMoney = (long) height * width; // 구한 범위와 가격을 곱하여 계산된 최대 가치
maxMoney = Math.max(maxMoney, calculatedMoney); // 최대 가치 업트
}
stack.push(i); // 현재 인덱스를 스택에 푸쉬
}
return maxMoney;
}
}