[c++][백준 14719] 빗물
문제 (Gold 5)
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
입력
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
출력
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
문제 풀이
- 제일 위쪽부터 시작해서 빗물이 고일 수 없는 부분을 체크
- 왼쪽과 오른쪽에서 출발하여 블록 or 끝을 만날 때까지 -1을 채우며 이동위와 같은 예제에서 다음과 같은 순서로 빗물이 고일 수 없는 부분을 체크
- 첫 번째는 왼쪽과 오른쪽 모두 블록을 만날 때까지 이동하며 -1을 채움
- 두 번째는 왼쪽의 경우 바로 블록을 만났기 때문에 채우지 않으며 오른쪽만 블록을 만날 때까지 -1을 채움
- 양쪽 모두 바로 블록을 만났을 경우 반복문을 탈출하고 빗물이 고일 수 있는 영역(Array에서 0인 영역)의 개수를 출력
코드
#include <iostream>
using namespace std;
int arr[501][501];
int main() {
int H, W;
cin >> H >> W;
int n;
for(int j=0; j<W; ++j) {
cin >> n;
for(int i=0; i<n; ++i) {
arr[i][j] = 1;
}
}
for(int i=H-1; i>=0; --i) {
int l = 0, r = W-1;
if(arr[i][l] == 1 && arr[i][r] == 1) break;
while(arr[i][l] == 0) {
arr[i][l] = -1;
l++;
}
while(arr[i][r] == 0) {
arr[i][r] = -1;
r--;
}
}
int answer = 0;
for(int i=0; i<H; ++i) {
for(int j=0; j<W; ++j) {
if(arr[i][j] == 0) answer++;
}
}
cout << answer;
return 0;
}
문제 링크
Author And Source
이 문제에 관하여([c++][백준 14719] 빗물), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wadekang/c백준-14719-빗물저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)