백준 창고 다각형

KIMYEONGJUN·2025년 3월 15일
0
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개의 댓글

관련 채용 정보