[백준] 창고 다각형 2304 java

오늘내일·2024년 6월 16일
0

최적의 풀이는 아니지만 문제 접근하는 방법이 참고가 될 수 있지 않을까해서 올려봅니다. 코드에 주석 참고해주세요.

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

public class 창고다각형_2304_2 {
  // 기둥 폭 1m
  //  1. 지붕은 수평 부분과 수직 부분으로 구성되며, 모두 연결되어야 한다.
  //  2. 지붕의 수평 부분은 반드시 어떤 기둥의 윗면과 닿아야 한다.
  //  3. 지붕의 수직 부분은 반드시 어떤 기둥의 옆면과 닿아야 한다.
  //  4. 지붕의 가장자리는 땅에 닿아야 한다.
  //  5. 비가 올 때 물이 고이지 않도록 지붕의 어떤 부분도 오목하게 들어간 부분이 없어야 한다.
  // 가장 작은 창고 면적
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    // 입력범위가 n이 1이상 1000이하 이기 때문에 기둥을 입력받을 수 있는 배열을 아래와 같이 만든다.
    int[] board = new int[1001];

    // 기둥 입력값을 받으면서 기둥의 높이 최대값과 그 위치를 업데이트 한다.
    int maxIdx = 0;
    int max = 0;
    for (int i = 0; i < n; i++) {
      StringTokenizer st = new StringTokenizer(br.readLine());
      int l = Integer.parseInt(st.nextToken());
      int h = Integer.parseInt(st.nextToken());

      board[l] = h;
      if (h > max) {
        maxIdx = l;
        max = h;
      }
    }

    // 왼쪽에서부터 기둥 높이 최대값의 위치까지 기존 기둥의 높이보다 더 높은 기둥의 높이가 나타나면 높이를 새롭게 갱신해주면서 면적을 더한다.
    // ex. 배열이 {0, 3, 5, 6, 2, 0} 이와 같이 구성되어 있으면 높이 최대값은 6이고, 최대값의 인덱스는 3이다.
    //     최초 높이를 0으로 하고, 0번 인덱스부터 최대값의 인덱스 3까지 하나씩 보면 1번 인덱스의 높이가 최초 높이 0보다
    //     크기 때문에 높이를 1번 인덱스의 값인 3으로 갱신하고 2번 인덱스의 높이가 기존 높이 3보다 크기 때문에 5로 갱신하여 누적합을 구한다.
    // 면적의 합은 폭이 1이기 때문에 각 위치의 높이의 합과 같다.
    int result = max;
    int height = 0;
    for (int i = 0; i < maxIdx; i++) {
      if (board[i] > height) {
        height = board[i];
      }
      result += height;
    }

    // 위에서 했던 방법을 오른쪽에서부터 기둥 높이 최대값의 위치까지 하나씩 줄여오면서 반복한다.
    height = 0;
    for (int i = board.length - 1; i > maxIdx; i--) {
      if (board[i] > height) {
        height = board[i];
      }
      result += height;
    }

    System.out.println(result);
  }
}
profile
다시 시작합니다.

0개의 댓글