Algorithm
[백준 Platinum 5] 6549 히스토그램에서 가장 큰 직사각형 - Java
Ray
2021. 12. 19. 19:32
문제링크 : https://www.acmicpc.net/problem/6549
6549번: 히스토그램에서 가장 큰 직사각형
입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤
www.acmicpc.net
접근 과정 :
- 주어진 직사각형들을 순회하면서, 현재 i번째 사각형까지 만들 수 있는 직사각형의 넓이를 구하려고 했다.
- 현재 i번째 사각형과 비교해서 가능한 높이의 이전 사각형을 Stack에 담아서 비교하고자 하였다.
소스 코드 및 결과 :
package BOJ;
/*
히스토그램에서 가장 큰 직사각형
*/
import java.io.*;
import java.util.*;
public class BOJ6549 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
while (true) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
if (n == 0) {
break;
}
long[] h = new long[n];
for (int i = 0; i < n; i++) {
h[i] = Long.parseLong(st.nextToken());
}
long max = 0;
Stack<Integer> stack = new Stack();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && h[stack.peek()] > h[i]) {
long before = h[stack.pop()];
int width = i;
if (!stack.isEmpty()) {
width = (i - stack.peek() - 1);
}
if (max < width * before) {
max = width * before;
}
}
stack.push(i);
}
while (!stack.isEmpty()) {
long before = h[stack.pop()];
int width = n;
if (!stack.isEmpty()) {
width = (n - stack.peek() - 1);
}
if (max < width * before) {
max = width * before;
}
}
sb.append(max + "\n");
}
System.out.println(sb.toString().trim());
}
}
P.S
이번 문제는 시간초과로 인해 많은 고생을 하였다....
https://www.acmicpc.net/blog/view/12
히스토그램에서 가장 큰 직사각형
6549번 문제: 히스토그램에서 가장 큰 직사각형 히스토그램에서 가장 큰 직사각형을 찾는 방법을 알아보겠습니다. 문제 히스토그램에서 모든 막대의 너비는 1이고, 높이는 hi일 때, 가장 넓이가
www.acmicpc.net
결국 해당 설명을 보고 다시 접근을 하였고.. 사실상 거의 복붙으로 문제를 해결한 것 같다.ㅜㅜ
분리집합으로 해결하는 부분은 나중에 한번더 이해하고 해결해보아야겠다.