본문 바로가기
코딩테스트/백준

백준 14719] C++ 빗물

by Hwan2 2020. 11. 4.
반응형

해당 문제는 백준 사이트에서 풀 수 있습니다.

 

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

 

1. 문제

 

 

문제

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:

힌트 2:

힌트 3:

출처

University 충남대학교 생각하는 프로그래밍 대회 D번

  • 문제를 만든 사람: isku
 
 
 
 
 

2. 조건

1.  위 그림과 같은 블록이 있을 때 그 사이에 들어갈 수 있는 빗물의 양을 구하여라.
2. 담을 수 없는 공간이 있다면 0으로 처리한다. ( 0, 1, 4, 0 )이라고 할 때
 

3. 풀이

해당 문제는 내 자신을 기준으로 왼쪽 오른쪽을 검색한 다음 왼쪽기준 가장 큰놈과 오른쪽 기준 가장 큰놈 중
제일 작은놈을 기준으로 나 자신을 빼면 해당 위치에서 받을 수 있는 물의 양이 나오게 됩니다.
 
즉,

1.

 

 

 

2.

 

3.

 

 

이 과정을 반복하면 됩니다. 이렇게 되면 쉽고 간단하게 빗물의 양을 구할 수 있게 됩니다.

 

4. 코드

#include <iostream>
#include <vector>

int main() {
    int T;
    int N, M, K;
    int X, Y;
    int answer = 0;

    cin >> N >> M;
    vector<int> v(M);

    for (int i = 0; i < M; i++)
        cin >> v[i];

    for (int i = 1; i < M - 1; i++) {
        int left = 0; int right = 0;
        //왼쪽 최대 값
        for (int j = 0; j < i; j++) left = max(left, v[j]);
        //오른쪽 최대 값
        for (int j = M - 1; j > i; j--) right = max(right, v[j]);
        //빗물 계산
        answer += max(0, min(left, right) - v[i]);
    }

    cout << answer << endl;
    return 0;
}
 

 

 

반응형

'코딩테스트 > 백준' 카테고리의 다른 글

백준 12851] C++ 숨바꼭질2  (0) 2020.11.06
백준 1697] C++ 숨바꼭질  (0) 2020.11.05
백준 19236] C++ 청소년 상어  (3) 2020.10.16
백준 2805번] C++ 나무 자르기  (0) 2020.06.16
백준 1463] C++ 1로 만들기  (0) 2020.06.16

댓글


스킨편집 -> html 편집에서