백준 문제풀이
[백준][구현] 14719 빗물 c++구현
꽁이꽁설꽁돌
2024. 3. 13. 17:57
728x90
반응형
목차
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
문제
문제 구현 방향
보이는 대로 바닥을 채우고 블록은 1로 표시하여 2차원 배열로 만들어 직접 반복문을 통해
카운트하는 방식으로 문제를 풀었다.
문제 풀이 시 주의점
바닥이 항상 막혀있다는 점과 언제부터 카운트를 할지 시점만 잘 주의해 주면 된다.
코드 구현
#include <iostream>
using namespace std;
int ml = 0; //빗물 세어주기
int main() {
int H, W, i, j, num;
cin >> H >> W;
int** arr = new int* [H+1]; //바닥은 있다 가정하므로 블록으로 채워준다
for (i = 0; i < H + 1; i++)
{
arr[i] = new int[W];
for (int j = 0; j < W; j++) {
arr[i][j] = 0; // 0으로 초기화
}
}
for (i = 0; i < W; i++) {
arr[0][i] = 1; //바닥을 블록으로 채워줌
}
for (i = 0; i < W; i++) {
cin >> num;
for (j = 1; j <= num; j++) {
arr[j][i] = 1; //블록만 1로 표시
}
}
for (i = H; i >= 0; i--) {
bool check1 = false; //시작점 flag신호
int s = 0;
for (j = 0; j < W; j++) {
if (arr[i][j] == 1 && !check1) { //시작점이 false이고 블록일 경우 시작점을 초기화
check1 = true;
}
else if (arr[i][j] == 0 && check1) { //시작점이 true일 경우 카운트 시작
s++;
}
else if (arr[i][j] == 1 && check1) { //시작점이 true이고 블록일 경우
if (s != 0) { //카운트가 0이 아닐경우에만 누적해주고 초기화
ml += s;
s = 0;
}
}
}
}
cout << ml;
}
반응형