반응형
https://www.acmicpc.net/problem/14719
문제
빗물
시간 제한메모리 제한제출정답맞은 사람정답 비율
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 |