반응형
구현 문제였습니다.
풀이방법
1. 왼쪽에서 오른쪽으로 보면서 현재 높이가 이전 높이보다 낮다면 여태까지 가장 큰 높이의 블록높이 - 현재 블록의 높이 즉, 가로에서 i번째 위치에서 고이는 빗물의 높이 값을 d[i][0]에 저장합니다. 만약 높다면 가장 높은 높이의 값을 갱신해줍니다.
2. 오른쪽에서 왼쪽으로 보면서 같은 방식을 적용합니다.
3. 다시 처음부터 끝까지 보면서 고인 빗물의 최소값을 다 더한뒤 출력해줍니다.
Code
#include <bits/stdc++.h>
using namespace std;
//i번째 건물 오른쪽으로
//i번째 건물 왼쪽으로
int h, w, big, ans, world[501], d[501][2];
int main(){
cin >> h >> w;
for(int i = 1; i <= w; i++) cin >> world[i];
big = world[1];
for(int i = 2; i <= w; i++){
if(big > world[i]) d[i][0] = big - world[i];
else big = world[i];
}
big = world[w];
for(int i = w - 1; i >= 1; i--){
if(big > world[i]) d[i][1] = big - world[i];
else big = world[i];
}
for(int i = 1; i <= w; i++) ans += min(d[i][0],d[i][1]);
cout << ans;
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 프로그래머스(2018 KAKAO BLIND RECRUITMENT[3차]) : 압축 (0) | 2021.05.04 |
---|---|
(C++) - 백준(BOJ) 16935번 : 배열 돌리기 3 답 (0) | 2021.05.03 |
(C++) - 백준(BOJ) 1722번 : 순열의 순서 (0) | 2021.05.03 |
(C++) - 백준(BOJ) 17135번 : 캐슬 디펜스 (0) | 2021.04.30 |
(C++) - 백준(BOJ) 8972 번 : 미친 아두이노 (0) | 2021.04.29 |