백준 창고 다각형

KIMYEONGJUN·2025년 3월 15일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

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

내가 이 문제를 보고 생각해본 부분

입력 처리: BufferedReader와 StringTokenizer를 사용하여 기둥의 개수와 각 기둥의 위치 및 높이를 입력받는다.
기둥 클래스 정의: Pole 클래스를 정의하여 기둥의 위치와 높이를 저장한다.
기둥 정렬: 기둥의 위치를 기준으로 정렬한다.
가장 높은 기둥 찾기: 기둥 배열을 순회하여 가장 높은 기둥의 인덱스를 찾는다.
왼쪽 면적 계산: 왼쪽 기둥부터 가장 높은 기둥까지의 면적을 계산한다.
오른쪽 면적 계산: 오른쪽 기둥부터 가장 높은 기둥까지의 면적을 계산하고, 마지막으로 가장 높은 기둥의 높이를 추가한 후 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

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

// 백준 2304번 문제
public class Main961 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        Pole[] poles = new Pole[n];

        // 입력받은 기둥의 위치와 높이 저장
        for(int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            poles[i] = new Pole(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
        }

        // 기둥을 위치 기준으로 정렬
        Arrays.sort(poles);

        int totalArea = 0; // 창고 면적을 누적
        int highestIndex = 0;

        // 가장 높은 기둥 찾기
        for(int i = 0; i < n; i++) {
            if(poles[highestIndex].height < poles[i].height) {
                highestIndex = i;
            }
        }

        // 왼쪽에서 가장 높은 기둥까지 면적 계산
        int leftIndex = 0;
        for(int i = 0; i <= highestIndex; i++) {
            if(poles[leftIndex].height <= poles[i].height) {
                totalArea += (poles[i].position - poles[leftIndex].position) * poles[leftIndex].height;
                leftIndex = i;
            }
        }

        // 오른쪽에서 가장 높은 기둥까지 면적 계산
        int rightIndex = n - 1;
        for(int i = n - 1; i >= highestIndex; i--) {
            if(poles[rightIndex].height <= poles[i].height) {
                totalArea += (poles[rightIndex].position - poles[i].position) * poles[rightIndex].height;
                rightIndex = i;
            }
        }

        // 가장 높은 기둥의 높이 추가
        totalArea += poles[highestIndex].height;

        // 결과 출력
        System.out.println(totalArea);
        br.close();
    }

    // 기둥 클래스를 정의
    public static class Pole implements Comparable<Pole> {
        public int position; // 기둥의 위치
        public int height; // 기둥의 높이

        public Pole(int position, int height) {
            this.position = position;
            this.height = height;
        }

        // 위치 기준으로 정렬하기 위한 오버라이드
        @Override
        public int compareTo(Pole p) {
            return this.position - p.position;
        }
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글