티스토리 뷰
히스토그램에서 가장 큰 직사각형 찾기
문제
히스토그램이란, 아래 그림과 같이 직사각형이 배열되어 있는 것을 말한다. 각 직사각형의 가로 길이는 1로 모두 같고, 세로 길이는 다를 수 있다. 예를 들어, 아래 그림은 높이가 2, 1, 4, 5, 1, 3, 3 인 직사각형으로 이루어진 히스토그램이다.
히스토그램이 주어질 때, 가장 큰 직사각형의 너비를 출력하는 프로그램을 작성하시오. 위의 예제에서는 최대 직사각형의 너비가 그림과 같이 8이다.
입력
첫째 줄에 히스토그램을 이루는 직사각형의 개수 N이 주어진다. ( 1 ≤ N ≤ 100,000 ) 둘째 줄에는 각 직사각형의 높이가 주어진다.
출력
최대 직사각형의 너비를 출력한다.
예제 입력
7
2 1 4 5 1 3 3
예제 출력
8
출처
University of Ulm local contest 2003 H
야매로 푼 코드
///히스토그램
import java.util.*;
public class Main {
public static ArrayList<Integer> box = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int[] b;
int[] c;
int d = 0;
int max = Integer.MIN_VALUE;
int result = 0;
Stack<int[]> stack = new Stack<>();
a = sc.nextInt();
b = new int[a];
for (int i = 0; i < a; i++) {
b[i] = sc.nextInt();
}
sc.close();
stack.push(new int[]{-1, -1});
result = a;
int tmp;
for (int i = 0; i < a; i++) {
while (!stack.isEmpty() && stack.peek()[0] >= b[i]) {
stack.pop();
}
tmp = b[i] * (i - stack.peek()[1]);
int j = i + 1;
while (j < a && b[j] >= b[i]) {
j++;
tmp += b[i];
}
if (tmp > result) result = tmp;
stack.push(new int[]{b[i], i});
}
System.out.println(result);
}
}
제대로 푼 코드
///히스토그램
import java.util.*;
public class Main {
public static ArrayList<Integer> box = new ArrayList<>();
//ex
//7
//2 1 4 5 1 4 4
//answer
//8
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int[] b;
int[] c;
int d = 0;
int max = Integer.MIN_VALUE;
int result = 0;
Stack<int[]> stack = new Stack<>();
a = sc.nextInt();
b = new int[a + 1];
b[a] = -1;
for (int i = 0; i < a; i++) {
b[i] = sc.nextInt();
}
stack.push(new int[]{-1, -1});
sc.close();
result = a;
int tmp;
for (int i = 0; i <= a; i++) {
if (!stack.isEmpty() && stack.peek()[0] < b[i]) {
stack.push(new int[]{b[i], i});
} else {
while (!stack.isEmpty() && stack.peek()[0] > b[i]) {
int[] tmpInt = stack.pop();
tmp = tmpInt[0] * (i - 1 - stack.peek()[1]);
if (tmp > result) result = tmp;
}
stack.push(new int[]{b[i], i});
}
}
System.out.println(result);
}
}
'알고리즘 문제 풀이 ' 카테고리의 다른 글
두용액 (0) | 2018.10.03 |
---|---|
구슬 상자 (0) | 2018.10.03 |
NN단표 (0) | 2018.10.03 |
나무자르기 (이분탐색) (0) | 2018.10.03 |
달팽이는 올라가고 싶다 (0) | 2018.10.01 |
탑 (0) | 2018.10.01 |
괄호의값 (0) | 2018.10.01 |
Merge sort (0) | 2018.10.01 |
- Total
- Today
- Yesterday
- 중간거리 #야만나 #약속장소추천 #중간위치 #웹 #리액트 #React #reactjs #kakao지도 #kakaoapi
- javascript #연속합 #알고리즘 #백준
- Javascript
- npm
- webpack
- Game
- java #알고리즘 #백준 #패션왕신해빈
- 백준
- javascript #백준 #회의실배정 #알고리즘
- java #알고리즘 #백준
- java #알고리즘 #백준 #퇴사
- TypeScript
- 쿼드트리
- 알고리즘
- 백준 #알고리즘 #전깃줄 #NodeJs #javascript
- react
- java #하노이 #알고리즘 #백준
- java #오르막수 #백준 #알고리즘
- javascript #백준 #알고리즘 #LCS
- java #백준 #알고리즘 #로또 #6603
- 색종이자르기
- Terminal
- 1992번
- java #알고리즘 #백준 #N과M #백트래킹
- 백준 #java #알고리즘
- webspider
- 한글 자동 완성
- java #백준 #알고리즘 #2805 #나무자르기
- 2630번
- java #퀵소트 #quicksort #알고리즘 #백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |