빗물 14719

LJM·2023년 9월 19일
0

백준풀기

목록 보기
237/259

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

가장 낮은곳 비어있는곳부터 양 옆으로 벽이 있으면 물을 채우는 방식으로 풀었다!!

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());

        int[][] block = new int[H][W];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < W; i++) {
            int height = Integer.parseInt(st.nextToken());
            int cnt = 0;
            for(int j = H-1; j >= 0; j--)
            {
                if(cnt >= height)
                    break;
                block[j][i] = 1;
                cnt++;

            }
        }

        boolean[][] visit = new boolean[H][W];
        //낮은곳부터 물 담을 수 있는지 탐색
        for (int i = 0; i < W; i++) {

            for (int j = H-1; j >= 0; j--) {

                if(block[j][i] != 0)
                    continue;

                if(visit[j][i])
                    continue;

                //왼쪽 탐색 벽있는지
                boolean leftwall = false;
                int leftwallpos = 0;
                int col = i;
                while(col>=0)
                {
                    visit[j][col] = true;
                    if(block[j][col] == 1)
                    {
                        leftwall = true;
                        leftwallpos = col;
                        break;
                    }
                    col--;
                }

                //오른쪽 탐색 벽있는지
                boolean rightwall = false;
                int rightwallpos = 0;
                col = i;
                while(col < W)
                {
                    visit[j][col] = true;
                    if(block[j][col] == 1)
                    {
                        rightwall = true;
                        rightwallpos = col;
                        break;
                    }
                    col++;
                }

                if(leftwall && rightwall)
                {
                    for (int k = leftwallpos+1; k < rightwallpos; k++) {
                        block[j][k] = 2;

                    }
                }

            }
        }

        int answer = 0;
        for (int i = 0; i < W; i++) {
            for (int j = 0; j < H; j++) {
                if(block[j][i] == 2)
                    answer++;
            }
        }

        System.out.println(answer);
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN