Algorithm

[백준] 빗물 14719번 (c++) 구현

salmon16 2024. 9. 20. 19:42

출처 : https://www.acmicpc.net/problem/14719

풀이 방법

x좌표를 기준으로 현재 지역은 왼쪽에서 가장 큰 값과 오른쪽에서 가장 큰 값 중 작은 값에서 자신의 블록 높이를 뺀 만큼 물이 차오르게 된다.

그러므로 각각의 왼 쪽 최댓값과 오른쪽 최댓값을 구해 자신의 블록 길이만큼 빼주면 된다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {

    vector<int> block;    
    int H, W;
    cin >> H >> W;
    int answer = 0;

    for (int i = 0; i < W;i++) {
        int a;
        cin >> a;
        block.push_back(a);
    }        
    for (int i =1;i < W-1;i++) { // 처음과 끝은 생략한다.
        int left = 0, right = 0;
        for (int k = i; k >= 0; k--) {
            left = max(left, block[k]);
        }
        for (int k = i; k < W;k++) {
            right = max(right, block[k]);
        }
        answer += max(0, min(left, right) - block[i]);
    }
    cout << answer;
    return 0;
}