백준 14719 빗물

이상민·2023년 8월 24일
0

알고리즘

목록 보기
27/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Rain {
    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[][] map = new int[H][W];
        boolean flag = false;
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < W; i++) {
            int height = Integer.parseInt(st.nextToken());
            for (int j = H-1; j >= H-height; j--) {
                map[j][i]=1;
            }
        }
        int answer = 0;
        for (int i = 0; i < H; i++) {
            int count = 0;
            flag = false;
            for (int j = 0; j < W; j++) {
                if(!flag && map[i][j]==1){// 처음 벽을 만날때,
                    flag=true;
                }
                else if(flag && map[i][j]==1){ // 두번째 벽을 만났을때
                    answer += count;
                    count = 0;
                }
                if(flag && map[i][j]==0){
                    count++;
                }
            }

        }
        System.out.println(answer);

    }
}

풀이 방법

📢 이풀이의 핵심은 행 하나를 탐색하며 벽과 벽 사이에 있는 칸을 세는것이 빗물이 고인지점을 세는 것과 같다는것을 파악하는 점이다.
flag를 통해 지금 고인 지점을 세고 있는지 아닌지 체크한다.

  1. 첫번째 벽을 만나면 flag = true를 통해 표시해준다.
  2. 첫번째 벽을 만난 이후의 인덱스값을 셀때마다, count를 증가 시킨다.
  3. 두번째 벽, flag=true일때 map이 1인 지점을 만나면 그동안의 count값을 answer에 넣어준다.

후기

일단 문제 이해부터 쉽다. 맵에 입력하는부분, flag체크로 벽을 체크하는점만 생각해낸다면 쉬운 문제였다.

profile
개린이

0개의 댓글