[문제]
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다. 기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
[코드]
import java.util.*;
class Info_2304 {
int l,h;
public Info_2304(int l, int h) {
this.l=l;
this.h=h;
}
}
public class BaekJoon_2304 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ArrayList<Info_2304> info=new ArrayList<>();
for(int i=0;i<n;i++) {
int L=sc.nextInt();
int H=sc.nextInt();
info.add(new Info_2304(L,H));
}
Collections.sort(info, new Comparator<Info_2304>() {
@Override
public int compare(Info_2304 o1, Info_2304 o2) { // L 값을 기준으로 오름차순 정렬
// TODO Auto-generated method stub
return o1.l-o2.l;
}
});
int result=0;
int maxheight=0; // 가장 높은 기둥
// 가장 높은 기둥을 기준으로 왼쪽 창고 넓이 + 높은 기둥 넓이 + 오른쪽 창고 넓이
Info_2304 past=info.get(0); // 시작 지점
for(int i=1;i<info.size();i++) { // 왼쪽 창고 넓이
Info_2304 now=info.get(i);
if(past.h<=info.get(i).h) {
result+=(now.l-past.l)*past.h;
past=now;
maxheight=i;
}
}
past=info.get(info.size()-1); // 시작 지점
for(int i=info.size()-2;i>=maxheight;i--) { // 오른쪽 창고 넓이
Info_2304 now=info.get(i);
if(past.h<=now.h) {
result+=(past.l-now.l)*past.h;
past=now;
}
}
result+=info.get(maxheight).h; // 높은 기둥 넓이 더해주기
System.out.println(result);
}
}
[고찰]
이번 문제는 정렬를 통해 해결할 수 있었다. x좌표를 기준으로 기둥을 정렬해 주고 가장 높은 기둥을 기준으로 왼쪽 창고 넓이와 오른쪽 창고 넓이를 구한 후 가장 높은 기둥의 넓이를 더해주면 결과값을 얻을 수 있었다.
'백준' 카테고리의 다른 글
[백준_1138번] 한 줄로 서기 (0) | 2023.08.25 |
---|---|
[백준_2075번] N번째 큰 수 (0) | 2023.08.25 |
[백준_22233번] 가희와 키워드 (0) | 2023.04.14 |
[백준_20310번] 타노스 (0) | 2023.04.14 |
[백준_14502번] 연구소_삼성 SW 역량테스트 (0) | 2023.04.05 |