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);
        }
    }
}