rueki

BOJ 14719 . 빗물 본문

C, C++ 문제풀이

BOJ 14719 . 빗물

륵기 2020. 10. 26. 17:00
728x90
반응형

물이 고일 때 해당 인덱스 위치에서 좌,우의 벽이 현재 인덱스 벽 높이보다 낮으면 빗물이 고일 수가 없다.

첫 번째 테스트 케이스에서 맨 왼쪽은 3, 현재 인덱스는 0, 오른쪽 인덱스는 1이라고 가정할 때 현재 인덱스에 대한 높이가 제일 낮기에 빗물이 고일 수 있다. 여기서 얼마나 고일 지 어떻게 계산할 지가 관건이다.

현재 인덱스의 왼쪽에 존재하는 인덱스들의 벽 높이 중에서 최대값과, 오른쪽에 해당하는 최대값을 구하여 둘 중의 최소값을 구해서 그 값에 현재 인덱스에 해당하는 벽 높이를 빼면 물 높이를 구할 수가 있다.

예를 들어보자.

인덱스 1에 해당하는 벽의 높이는 0, 왼쪽에서 제일 큰 벽 높이는 3, 오른쪽에서는 4이다.

물이 고일때 3을 넘을 경우 물이 넘치기 때문에 여기서 최소값을 구해주어야 하는 것이다. 즉 여기서 3이 될테고, 3 - 0 = 3. 즉 1번 인덱스 위치에 물이 3만큼 고이게 된다.

이렇게 반복을 하면 되는데, 추가로 생각해주어야 할 점은 맨 왼쪽 벽과 오른쪽 벽은 끝과 끝이므로 해당 인덱스서 포함하지 않는게 좋다.

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int lmax(vector<int> vec, int idx)
{
	int m = 0;
	// i = 1
	for (int i = idx-1; i >=0; i--)
	{
		m = max(m, vec[i]);
	}
	return m;
}

int rmax(vector<int> vec, int idx)
{
	int m = 0;
	for (int i = idx + 1; i < vec.size(); i++)
	{
		m = max(m, vec[i]);
	}
	return m;
}


int main()
{
	int H, W;
	cin >> H>>W;
	vector<int> vec(W);

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

	int water = 0;
	int lx, rx,hv;
	for (int i = 0; i < vec.size(); i++)
	{
		lx = lmax(vec, i);
		rx = rmax(vec, i);
		hv = min(lx, rx);
		if (hv > vec[i]) {
			water += hv - vec[i];
		}
	}
	cout << water << endl;




	return 0;
}

 

728x90
반응형

'C, C++ 문제풀이' 카테고리의 다른 글

BOJ 2501.약수 구하기  (0) 2020.12.22
BOJ 5635. 생일  (0) 2020.12.22
BOJ 11005. 진법 변환 2  (0) 2020.10.26
BOJ 9613. GCD 합  (0) 2020.10.26
BOJ 2609 최대공약수와 최소공배수  (0) 2020.10.26
Comments