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를 통해 지금 고인 지점을 세고 있는지 아닌지 체크한다.
일단 문제 이해부터 쉽다. 맵에 입력하는부분, flag체크로 벽을 체크하는점만 생각해낸다면 쉬운 문제였다.