본문 바로가기
BaekJoon/Silver

[BOJ/JAVA] 백준 2304 : 창고 다각형 (자바)

by HoonSikE 2022. 3. 26.
반응형
SMALL
문제 정보
  문제명   - 창고 다각형
  난이도   - 실버 II
문제 번호 - 2304번

문제 링크

BOJ_S2_2304_창고_다각형

 

2304번: 창고 다각형

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의

www.acmicpc.net


문제
N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려고 한다. 창고에는 모든 기둥이 들어간다. 이 창고의 지붕을 다음과 같이 만든다.
 1. 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
 2. 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
 3. 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
 4. 지붕의 가장자리는 땅에 닿아야 한다.
 5. 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
그림 1은 창고를 옆에서 본 모습을 그린 것이다. 이 그림에서 굵은 선으로 표시된 부분이 지붕에 해당되고, 지붕과 땅으로 둘러싸인 다각형이 창고를 옆에서 본 모습이다. 이 다각형을 창고 다각형이라고 하자.
[그림1. 기둥과 지붕(굵은 선)의 예]
창고 주인은 창고 다각형의 면적이 가장 작은 창고를 만들기를 원한다. 그림 1에서 창고 다각형의 면적은 98 ㎡이고, 이 경우가 가장 작은 창고 다각형이다.
기둥들의 위치와 높이가 주어질 때, 가장 작은 창고 다각형의 면적을 구하는 프로그램을 작성하시오.

입력
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다.
그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.

출력
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.

예제 입력/출력
예제 입력 예제 출력
7
2 4
11 4
15 8
4 6
5 3
8 10
13 6
98

알고리즘 분류
● 자료 구조
브루트포스 알고리즘
 스택


소스코드
package Lv2_Silver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
/**
 * @author HanHoon
 * @category 자료 구조, 브루트포스 알고리즘, 스택
 * https://www.acmicpc.net/problem/2304
 */
class Storage implements Comparable<Storage>{
	int L;
	int H;
	public Storage(int l, int h) {
		L = l;
		H = h;
	}
	@Override
	public int compareTo(Storage o) {
		return this.L - o.L;
	}
}
public class BOJ_S2_2304_창고_다각형 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		// 기둥의 개수
		int N = Integer.parseInt(br.readLine());
		// 지붕 list
		ArrayList<Storage> list = new ArrayList<>();
		// 지붕의 최대 높이
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			// 기둥의 위치 
			int L = Integer.parseInt(st.nextToken());
			// 기둥의 높이
			int H = Integer.parseInt(st.nextToken());
			// 지붕의 최대높이 갱신
			max = max < H ? H : max;
			// list에 기둥의 정보를 담음
			list.add(new Storage(L, H));
		}
		// 기둥 순서대로 정렬
		Collections.sort(list);
		int result = 0;
		// 첫번쨰 기둥 정보 저장
		Storage tmp = list.get(0);
		// 가장 높은 기둥이 2개가 있을 수도 있다는 점에 주의하자.
		int lastIndex = 0;
		// max 기준 좌측
		for (int i = 1; i < list.size(); i++) {
			if(tmp.H <= list.get(i).H) {
				result += (list.get(i).L - tmp.L) * tmp.H;
				tmp = list.get(i);
				lastIndex = i;
			}
		}
		// 마지막 기둥 정보 저장
		tmp = list.get(list.size()-1);
		// max 기준 우측
		for (int i = list.size()-2; i >= lastIndex; i--) {
			if(tmp.H <= list.get(i).H) {
				result += (tmp.L - list.get(i).L) * tmp.H;
				tmp = list.get(i);
			}
		}
		// 제일 높은 기둥 높이 더함.
		result += max;
		
		System.out.println(result);
		br.close();
	}
}

 


BaekJoon List
 

BaekJoon List

BOJ Start!! ● [BOJ] 백준 회원가입, 시작하는 법 ● [BOJ] 등급(티어) 및 Solved.AC 적용 ● [BOJ/JAVA] 백준 소스코드 제출 시 유의사항(자바) Bronze ● Bronze V  - ● Bronze IV  - ● Bronze III  -..

han-hoon.tistory.com


  

기회는 준비된 자에게 찾아온다.

 


 

반응형
LIST

댓글