- 문제설명
- 풀이코드
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
32
33
34
|
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void){
int h,w;
int answer = 0;
cin >> h >> w;
vector<int> blocks(w,0);
for(int i=0;i<w;i++){
cin >> blocks[i];
}
for(int i=1;i<w-1;i++){
int i_th = blocks[i];
int left_max,right_max;
left_max = *max_element(blocks.begin(),blocks.begin()+i+1);
right_max = *max_element(blocks.begin()+i,blocks.end());
answer += min(left_max,right_max) - i_th;
}
cout << answer;
return 0;
}
|
cs |
- 시간복잡도
공간의 너비를 n개라 했을 때 O(n^2)
- 풀이
i번째 블럭을 기준으로 좌측 최대 높이블럭과 우측 최대 높이블럭을 찾아서 둘 중 높이가 낮은 블럭과 i번째 블럭의 높이차 만큼 빗물이 쌓인다고 생각하여 푼 문제이다. 주의해야할 점은 좌우측 최대 높이를 구할때 i 번째 블럭을 포함해야 한다는 점이다. 포함하지 않으면 0 0 0 2 3 또는 2 2 2 2 4 5 와 같은 입력에서 음수 값을 답으로 도출해내기 때문이다.
- Reference
'PS > 백준' 카테고리의 다른 글
[백준 - 16562] 친구비 (0) | 2020.11.22 |
---|