티스토리 뷰

배열로 높이가 주어질때, 물을 채운다고 생각해보자. 결국 물을 넘칠때까지 따르면 정답을 구할 수 있다.

각 칸을 기준으로 최대 높이 몇까지 채워질 수 있을까?

i에 물을 최대한 채울때, 왼쪽과 오른쪽을 전부 살펴보자. 이때 왼쪽에서 제일 높은 높이와 오른쪽에서 가장 높은 높이가 물을 채울 수 있는 기준이 된다는 것을 알 수 있다. 그리고 이 두 값중 작은 값까지 물을 채울 수 있으므로, 이 높이에 대해 O(2N)으로 전처리를 수행하면 간단하게 구할 수 있다.

#include <bits/stdc++.h>
#define MINF 0x7f7f7f7f
#define INF 2000000000
#define MOD 10007
#define NUM 100010
#define X first
#define Y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<ll, ll> pll;
typedef pair<double, int> pdi;
int N, l[NUM], r[NUM];


vector<string> split(string input, char delimiter) {
    vector<string> answer;
    stringstream ss(input);
    string temp;
    while (getline(ss, temp, delimiter)) {
        answer.push_back(temp);
    }
    return answer;
}


void init() { 
    cin >> N;
    cin.ignore();
    for (int i=0; i<N; i++) {
        int answer = 0;
        for (int j=0; j<NUM; j++) l[j] = 0, r[j] = 0;
        string s;
        getline(cin, s);
        vector<string> v = split(s, ' ');
        for (int j=0; j<v.size(); j++) {
            int num = stoi(v[j]);
            l[j] = num;
            r[j] = num;
        }
        for (int j=1; j<v.size(); j++) {
            l[j] = max(l[j], l[j-1]);
        }
        for (int j=v.size()-2; j>=0; j--) {
            r[j] = max(r[j], r[j+1]);
        }
        for (int j=1; j<v.size()-1; j++) {
            int num = min(l[j], r[j]);
            if (stoi(v[j]) >= num) continue;
            answer += (num - stoi(v[j])); 
        }
        cout << answer << '\n';
    }
}       

int main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    init();
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함