[C++]백준14719번 빗물

1 minute read

오늘은 백준14719번 빗물 문제를 풀어보도록 하자.

구현, 시뮬레이션 문제로 작년 하반기 Nxx코딩테스트에 나온 문제이다. 당시 많이 버벅였던 문제였다. 지금 풀어보니 굉장히 단순한 문제였다..

문제는 다음과 같다.

                               [접근법]

  1. 기준 인덱스로 부터 왼쪽, 오른쪽을 탐색하여 가장 큰 값들을 저장해놓는다.

  2. 그 후 저장된 값 중 작은 값에서 기준 인덱스의 map 값을 빼주어 result에 누적합 해준다.
  
  3. 물론 기준 인덱스의 map 값이 저장된 값 중 작은 값보다 크면 continue하여 계산하지 않는다. (빗물이 고이지 않으므로)
                                     [코드]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int H, W, result = 0;//세로, 가로, 답
	int map[500];//전체 맵

	cin >> H >> W;

	for (int i = 0; i < W; i++) {
		cin >> map[i];
	}

	for (int i = 1; i < W - 1; i++) {
		int l = 0, r = 0; // l은 기준에서 왼쪽, r은 기준에서 오른쪽

		for (int j = 0; j < i; j++) {
			l = max(map[j], l);
		}
		for (int j = i + 1; j < W; j++) {
			r = max(map[j], r);
		}
		
		if (map[i] > l || map[i] > r) {
			continue;
		}
		else {
			result += min(l, r) - map[i];
		}
	}
	cout << result << '\n';
	return 0;
}