어제의 나보다 성장한 오늘의 나

[백준][BOJ-1725][자바] 히스토그램 본문

알고리즘/백준(BOJ)

[백준][BOJ-1725][자바] 히스토그램

NineOne 2021. 4. 21. 21:13

www.acmicpc.net/problem/1725

 

1725번: 히스토그램

첫 행에는 N (1 ≤ N ≤ 100,000) 이 주어진다. N은 히스토그램의 가로 칸의 수이다. 다음 N 행에 걸쳐 각 칸의 높이가 왼쪽에서부터 차례대로 주어진다. 각 칸의 높이는 1,000,000,000보다 작거나 같은

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] height = new int[N];
		
		for(int i=0; i<N; i++) {
			height[i] = Integer.parseInt(br.readLine());
		}
		
		System.out.println(histogram(0,N,height));
	}
	
	public static int histogram(int left, int right, int[] height) {
		if(left == right) return 0;
		if(left+1 == right) return height[left];
		
		int mid = (left+right)/2;
		int result = Math.max(histogram(left, mid, height), histogram(mid, right, height));	// 각 양쪽 구간의 최댓값
		
		// 양쪽 구간에서 걸쳐 있는 답을 찾음
		int w =1, h = height[mid], l = mid, r = mid;
		while(r-l+1 < right-left) {
			int p = l>left ? Math.min(h, height[l-1]) : -1; // 왼쪽으로 확장했을 경우의 높이
			int q = r<right-1 ? Math.min(h, height[r+1]) : -1;	// 오른쪽으로 확장했을 경우의 높이
			
			// 더 높은(같은) 높이를 가진 쪽으로 확장
			if(p>=q) {
				h = p;
				l--;
			}
			else {
				h = q;
				r++;
			}
			
			//최댓값 갱신
			result = Math.max(result, ++w*h);
		}
		
		return result;
	}
}
Comments