728x90
문제
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
- 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
- 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
- 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
- 지붕의 가장자리는 땅에 닿아야 한다.
- 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.
입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.
출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
풀이
코드 참고
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int [] map=new int[1002], height = new int[1002];
int n = Integer.parseInt(br.readLine()), maxh=0, maxl=0, ans=0, pole;
for(int k=0;k<n;k++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int l=Integer.parseInt(st.nextToken());
int h=Integer.parseInt(st.nextToken());
map[l]=h;
maxh=Math.max(maxh,h); // 가장 높은 기둥의 높이
maxl=Math.max(maxl,l); // 가장 멀리 떨어진 기둥의 위치
}
pole=map[1]; // 좌측부터 시작하는 기둥으로 그려지는 다각형
for(int i=1;i<=maxl;i++) { // 좌측부터 끝까지 돌면서 증가하는 형태로 높이를 측정
pole=Math.max(pole, map[i]);
height[i]=pole;
}
pole=map[maxl]; // 우측부터 시작하는 기둥로 그려지는 다각형
for(int i=maxl;i>=1;i--) {
pole=Math.max(pole, map[i]);
if(pole==maxh) // 만약 가장 높은 높이의 기둥을 만난다면 끝낸다
break;
height[i]=pole;
}
// 가장 높은 건물을 만났을때
// 1. ㅂ 형태로 세어진 기둥이라면 중간에 들어간 공간이 없어야함 -> 정지
// 2. ㅅ 형태로 증가하는 기둥이라면 그 위치에서 더 간다면 좌측에서 이미 생성된 지붕보다 높이 측정됨
// 모든 그려진 지붕의 높이를 측정해서 값을 출력
for(int i=1;i<=maxl;i++)
ans+=height[i];
System.out.println(ans);
}
}
728x90
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 10836 여왕벌 JAVA (0) | 2022.04.25 |
---|---|
Baekjoon 10826 피보나치 수 4 JAVA (0) | 2022.04.25 |
Baekjoon 2003 수들의 합 2 JAVA (0) | 2022.04.25 |
Baekjoon 14501 퇴사 JAVA (0) | 2022.04.25 |
Baekjoon 13305 주유소 JAVA (0) | 2022.04.24 |
댓글