알고리즘/백준

[백준 14719] 빗물 C++

겜도리도리 2021. 10. 7. 22:48
반응형

문제

백준 14719 C++

 

14719번: 빗물

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

www.acmicpc.net

풀이

블록을 검은색, 빗물이 차는 곳을 파란색이라고 하면

예시 1

양 쪽 끝에 검은 영역이 있을 때, 그 사이의 모든 영역이 파란 영역이 됩니다.

예시 2

마찬가지로 양쪽 끝에 검은 영역이 있으면, 그 사이의 모든 영역이 파란 영역이 됩니다.

따라서 map을 전부 순회하면서, 블록과 블록 사이의 영역을 모두 구해줍니다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
int map[500][500];
 
int main()
{
    // 입력, 0 : 빈 곳, 1 : 블록
    int H, W;
    cin >> H >> W;
    int height;
    for (int i = 0; i < W; i++) {
        cin >> height;
        for (int j = H - height; j < H; j++) {
            map[j][i] = 1;
        }
    }
 
    // 전 영역을 돌면서 검사
    int raindrop = 0;
    for (int i = 0; i < H; i++) {
        int start = -1;
        for (int j = 0; j < W; j++) {
            // 블록일 때
            if (map[i][j] == 1) {
                if (start != -1) {
                    // 현재 위치와 start 사이 만큼 빗물이 찬다.
                    raindrop += j - start - 1;
                }
                // start 갱신
                start = j;
            }
        }
    }
    cout << raindrop;
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2206] 벽 부수고 이동하기 C++  (0) 2021.10.09
[백준 1987] 알파벳 C++  (0) 2021.10.08
[백준 13398] 연속합 2 C++  (0) 2021.10.07
[백준 2660] 회장뽑기 C++  (0) 2021.10.05
[백준 5582] 공통 부분 문자열 C++  (0) 2021.10.03