[Gold V] 빗물 - 14719
성능 요약
메모리: 15488 KB, 시간: 140 ms
분류
구현, 시뮬레이션
제출 일자
2025년 2월 9일 18:09:19
문제 설명
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
입력
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
출력
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
- 주어진 배열을 높이만큼 순회하며 0이 아닐 경우(기둥일 경우) 해당 인덱스를 stack에 넣고 1씩 감소한다.
- 기둥과 기둥 사이의 길이를 answer에 추가한다.
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int answer = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
int H = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int[] arr = new int[W];
for(int i=0; i<W; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
Stack<Integer> stack = new Stack<>();
for(int i=0; i<H; i++){
for(int j=0; j<W; j++){
if(arr[j] != 0){
stack.add(j);
arr[j] -= 1;
}
}
if(stack.size()>=1){
int lastIdx = stack.pop();
while(!stack.isEmpty()){
int n = stack.pop();
answer += lastIdx - n - 1;
lastIdx = n;
}
}
}
System.out.println(answer);
br.close();
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준/Java] 11660 - [Silver I] 구간 합 구하기 5 (0) | 2025.02.14 |
---|---|
[백준/Java] 13023 - [Gold V] ABCDE (0) | 2025.02.09 |
[백준/Java] 9012 - [Silver IV] 구간 합 구하기 5 (0) | 2025.02.07 |
[백준/Java] 2667 - [Silver I] 단지번호붙이기 (0) | 2025.01.19 |
[백준/Java] 11403 - [Silver I] 경로 찾기 (0) | 2024.12.30 |