본문 바로가기
백준/5001 - 10000

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

by lms0806 2024. 12. 15.
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
반응형

댓글