백준|2304번|창고 다각형

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
7/51

문제설명
N개의 막대 기둥의 높이와 위치를 입력받아서 막대 기둥을 모두 감싸는 도형을 만들 때 최소한의 크기를 출력하는 문제입니다. 단 기둥을 감싸는 도형의 조건은 오목하게 들어가는 부분이 없어야 한다는 것입니다.

작동 순서
1. 각 기둥들의 높이와 위치를 입력받습니다.
2. 기둥들을 순서대로 정렬합니다.
3. 기둥들중 가장 높은 기둥을 찾아 그 위치를 기준점으로 잡습니다.
4. 기준점을 기준으로 앞쪽과 뒷쪽으로 나눕니다.
5. 기준점 앞쪽은 앞에서부터 계산을 하며 현재 높이만큼 sum에 넓이를 계속 더해줍니다. 만약 현재 높이보다 더 높은 높이가 나오면 그 높이로 계산을 해줍니다.
6. 앞쪽의 계산이 끝나면 기준점의 높이를 sum에 더해줍니다.
7. 기준점 뒷쪽은 뒤에서부터 앞쪽과 같은 연산을 수행하는데 방향을 뒤에서부터 실행합니다.
8. 모든 연산이 끝나면 sum을 출력합니다.

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class 백준_2304번_창고다각형 {
    private static final BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    private static StringTokenizer st;
    static void input(int[][] arr, int i) throws IOException {
        st=new StringTokenizer(br.readLine());
        arr[i][0]=Integer.parseInt(st.nextToken());
        arr[i][1]=Integer.parseInt(st.nextToken());
    }

    static void sort(int[][] arr){
        Arrays.sort(arr, new Comparator<int[]>() {
            public int compare(int[] o1, int[] o2) {
                if(o1[0]==o2[0]){
                    return o1[1]-o2[1];
                } else{
                    return o1[0]-o2[0];
                }
            }
        });
    }

    static int find_pivot(int[][] arr){
        int pivot=0;
        for(int i=0;i<arr.length;i++){
            if (arr[pivot][1]<arr[i][1]) {
                pivot=i;
            }
        }
        return pivot;
    }

    public static void main(String[] args) throws IOException {
        int N=Integer.parseInt(br. readLine());
        int[][] arr=new int[N][2];
        int pivot = 0, sum=0, height=0;

        for(int i=0;i<N;i++){
            input(arr, i);
        }

        sort(arr);

        pivot=find_pivot(arr);

        height=arr[0][1];
        for (int i=1;i<=pivot;i++){
            sum+=height*(arr[i][0]-arr[i-1][0]);
            if (height<arr[i][1]) height=arr[i][1];
        }

        sum+=arr[pivot][1];

        height=arr[N-1][1];
        for (int i=N-2;i>=pivot;i--){
            sum+=height*(arr[i+1][0]-arr[i][0]);
            if(height<arr[i][1]) height=arr[i][1];
        }

        System.out.print(sum);
    }
}

후기
나름 코드를 함수로 정의하며 깔끔하게 만들어보려 했는데 잘 안되는 것 같습니다. 코드를 좀 더 깔끔하게 짤 수 있게 노력해봐야 할 것 같습니다.

profile
학사지만 AI하고 싶어요...

0개의 댓글