백준

[백준_2304번] 창고 다각형

빙수빈수 2023. 4. 16. 14:04

[문제]

N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.

 

  1. 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
  2. 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
  3. 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
  4. 지붕의 가장자리는 땅에 닿아야 한다.
  5. 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.

그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.

 

그림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