빗물

문제 풀러가기

14719

코드

import java.io.*;
import java.util.*;

class Main {
  static int[] map;
  static int ans, left, right;

  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int h = Integer.parseInt(st.nextToken());
    int w = Integer.parseInt(st.nextToken());

    map = new int[w];
    ans = left = right = 0; // 이러한 형태는 static(불변)일 때만 가능

    st = new StringTokenizer(br.readLine());

    for(int i = 0; i < w; i++) {
      int n = Integer.parseInt(st.nextToken());
      map[i] = n;
    }

    // 인덱스마다 모이는 빗물 계산 ( 첫번째 기둥과 마지막 기둥의 위치는 제외 )
    for(int i = 1; i < w - 1; i++) {
      left = right = 0;
      // 왼쪽에서 가장 높은 건물의 높이
      for(int j = 0; j < i; j++) {
        left = Math.max(map[j], left);
      }
      // 오른쪽에서 가장 높은 건물의 높이
      for(int j = i + 1; j < w; j++) {
        right = Math.max(map[j], right);
      }
      // 더 낮은 건물을 기준으로 현재 인덱스에 모이는 빗물
      if(map[i] < left && map[i] < right) {
        ans += Math.min(left, right) - map[i];
      }
    }

    System.out.println(ans);
  }
}

설명