개발 지식/알고리즘

[백준] 14719 빗물

트리맨스 2021. 5. 26. 00:48
반응형

 

문제 설명을 잘 읽어보자.

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

 

14719번: 빗물

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

www.acmicpc.net

 

빗물이 고이는 특성은 다음과 같다.

1. 좌측 끝과 우측 끝이 벽으로 막혀 있어야 한다.

2. 빗물이 찼을 때 양쪽 끝이 같다.

3. 중간에 구멍이 생길 일은 전혀 없다. (주어진 조건이 밑에서부터 위로 몇 칸 있는지 확인하므로)

 

이러한 특징을 기반으로 다음과 같은 풀이 알고리즘을 생각해 보았다.

1. 수면의 높이가 1~N 일때까지 탐색한다.

2. 물이 있는 시작점은 현재 탐색 칸이 벽이고, 탐색 다음칸은 물이다.

3. 물이 있는 끝점은 현재 탐색 칸이 물이고, 탐색 다음칸은 벽이다.

4. 혹시나 마지막 탐색 시 벽이 뚫려 있으면, 물이 고여 있지 않는다.

 

위의 조건을 바탕으로 구현을 해 보았다. 수면의 높이는 사각형의 윗변의 높이를 기준으로 탐색한다. 탐색방향은 아래에서 위로, 왼쪽에서 오른쪽으로 탐색을 진행하며 한번에 한 층의 조건만 탐색을 진행한다.

 

결과 코드는 다음과 같다.

 

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
38
39
#include <iostream>
#include <cstring>
using namespace std;
 
int block[501];
 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int h, w, ans = 0, temp, isWater;
    cin >> h >> w;
    for (int i = 0; i < w; i++)
        cin >> block[i];
    for (int dep = 1; dep <= h; dep++)
    {
        isWater = 0;
        temp = 0;
        for (int i = 0; i < w - 1; i++)
        {
            if (isWater)
            {
                ans++;
                temp++;
            }
            if ((block[i] - dep >= 0&& (block[i + 1- dep < 0))
                isWater = 1;
            if ((block[i] - dep < 0&& (block[i + 1- dep >= 0))
            {
                isWater = 0;
                temp = 0;
            }
        }
        ans -= temp;
    }
    cout << ans;
}
cs

 

반응형

'개발 지식 > 알고리즘' 카테고리의 다른 글

[백준] 4963 섬의 개수  (0) 2021.06.19
[백준] 1600 말이 되고픈 원숭이  (0) 2021.06.12
[백준] 2661 좋은 수열  (0) 2021.05.14
[백준] 1058 친구  (0) 2021.05.08
[백준] 1325 효율적인 해킹  (0) 2021.05.08