본문 바로가기

개발/알고리즘 & 자료구조

BOJ 14719 - 빗물 (C++)

반응형

https://www.acmicpc.net/problem/14719

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

 

문제

빗물

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 256 MB 5026 2670 2106 54.153%

문제

2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.

 

비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?

입력

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)

두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.

따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

출력

2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.

빗물이 전혀 고이지 않을 경우 0을 출력하여라.

예제 입력 1 복사

4 4 3 0 1 4

예제 출력 1 복사

5

예제 입력 2 복사

4 8 3 1 2 3 4 1 1 2

예제 출력 2 복사

5

예제 입력 3 복사

3 5 0 0 0 2 0

예제 출력 3 복사

0

 

코드

1. W : 1~>4 순서, H : 4~>1 순서로 어디까지(도착지:Reach) 닿는지 체크하면 된다.

2-1. 닿는 곳이 있다면 W=Reach

2-1. 닿는 곳이 없다면 W++

#include <iostream>
#include <algorithm>
using namespace std;

int h, w;
int waterHeight[501];
int ans;

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

	cin >> h >> w;

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

	for (int i = 0; i < w - 1; i++)
	{
		int startH;

		for (int l = waterHeight[i]; l >= 1; l--)
		{
			bool findFlag = false;
			startH = l;
			//cout << "i=" << i << "startH=" << startH << " ans=" << ans << endl;

			for (int j = i + 1; j < w; j++)
			{
				int endH = waterHeight[j];
				if (endH >= startH)
				{
					int ansH = min(startH, endH);
					//cout << "i=" << i << " j=" << j << " ansH=" << ansH << " | ";
					for (int k = i + 1; k < j; k++)
					{
						ans += (ansH - waterHeight[k]);
						//cout << " ans=" << ans;
					}
					//cout << endl;

					findFlag = true;
					i = j - 1;
					break;
				}
			}

			if (findFlag) 
				break;
		}
	}

	cout << ans;
	
	return 0;
}
반응형

'개발 > 알고리즘 & 자료구조' 카테고리의 다른 글

BOJ 1283 - 단축키 지정 (C++)  (0) 2021.10.05
BOJ 1662 - 압축 (C++)  (0) 2021.10.04
Leetcode 20 - Valid Parentheses  (0) 2021.09.29
BO 15657 - N과 M (8)  (0) 2021.09.28
BOJ 12865 - 평범한 배낭 (C++)  (0) 2021.09.27