문제링크 : https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
import java.io.*;
import java.util.*;
public class BJ14719HJ {
static int h, w, rain, wall_max, idx, wall, wall2, sum;
static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
arr = new int[w];
st = new StringTokenizer(br.readLine());
for (int i=0; i<w; i++){
int input = Integer.parseInt(st.nextToken());
arr[i] = input;
sum += input; // 블럭 높이 모두 더해 놓음
}
// 가장 높은 블록 & idx 찾기
for (int i=0; i<w; i++){
if (arr[i] > wall_max){
wall_max = arr[i];
idx = i;
}
}
// 블럭 최대 높이의 합을 구한 후, 본 배열의 합을 빼주면 고여 있는 빗물의 양이 됨.
for (int i=0; i<idx+1; i++){
if (arr[i] > wall){
wall = arr[i];
}
rain += wall;
}
for (int i=w-1; i>idx; i--){
if (arr[i] > wall2){
wall2 = arr[i];
}
rain += wall2;
}
System.out.println(rain - sum);
}
}
문제 해설 :
1. 최대높이를 기준으로 양옆으로 탐색
2. 고인 빗물의 양 = 배열을 탐색할 때 마다 갱신된 최대높이의 합 - 기존배열의 블럭의 합
즉, 빗물이 차있을 때의 블럭의 높이를 구한 후, 원래 블럭 높이만 빼주는 것
'Algorithm > Java' 카테고리의 다른 글
[백준] 17281 ⚾ (야구) (0) | 2024.04.17 |
---|---|
[백준] 8979 올림픽 (0) | 2024.04.11 |
[백준] 1864 스카이라인 쉬운거 (0) | 2024.04.08 |
[백준] 2146 다리 만들기 (0) | 2024.03.25 |
[백준] 14658 하늘에서 별똥별이 빗발친다 (0) | 2024.03.14 |