C# 백준 알고리즘
C# 백준 14719 빗물
프로핌
2024. 2. 29. 09:28
빗물
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 | 256 MB | 18074 | 10187 | 7948 | 56.485% |
문제
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:

이 문제는 골드5치고는 굉장히 쉬웠던 문제 같았다.
처음에 내가 체크하는 좌표가 벽이 있는지 없는지 체크하고 있으면 그걸 또 옆으로 가서 내가 벽인지 아닌지 부터 체크한다
내가 벽이면 true 아니면 false로 반환 그 다음엔 앞에 벽인지 물인지만 체크하고 벽이 있었는지 체크한다음에 벽이 있었으면 buket 양동이에 물을 담는다.
C#으로 푼 사람들도 대부분 나처럼 이런 방법으로 코드를 짠거 같았다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prob14719_빗물
{
class Program
{
static int buket;
static void Main(string[] args)
{
string[] arr = Console.ReadLine().Split();
int h = int.Parse(arr[0]);
int w = int.Parse(arr[1]);
int[,] mat = new int[h, w];
arr = Console.ReadLine().Split();
for (int i = 0; i < w; i++)
{
int wall = int.Parse(arr[i]);
for (int j = 0; j < wall; j++)
{
mat[j, i] = 2;
}
}
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w - 1;)
{
if(mat[i,j] == 2)
{
bool wallCheck = false;
int count = 0;
while (j < w - 1)
{
j++;
if (mat[i, j] == 2)
{
wallCheck = true;
break;
}
else if(mat[i, j - 1] == 2 || mat[i, j - 1] == 0)
{
count++;
}
}
if (wallCheck)
{
buket += count;
}
}
else
{
j++;
}
}
}
Console.WriteLine(buket);
}
}
}