문제
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
해설
- 각 행(H)마다 left(왼쪽 벽) right(오른쪽 벽)을 구한다. (각각 가장 왼쪽, 가장 오른쪽)
- 가장 왼쪽, 가장 오른쪽 벽 사이에 벽이 아닌 곳은 물이 고인다.
- 반복문을 통해 왼쪽벽부터 오른쪽 벽 사이에 물이 고일 수 있는 공간의 크기를 구한다.
코드
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
int H = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
int[][] map = new int[H][W];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < W; i++) {
int height = Integer.parseInt(st.nextToken());
for (int j = 0; j < height; j++) {
map[j][i] = 1;
}
}
sb.append(rain(H, W, map));
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static int rain(int h, int w, int[][] map) {
int sum = 0;
for (int i = 0; i < h; i++) {
int left = -1;
int right = -1;
for (int j = 0; j < w; j++) {
boolean check = map[i][j] == 1;
if (check) {
right = j;
}
if (check && left == -1) {
left = j;
}
}
for (int j = left; j < right; j++) {
if (map[i][j] == 0) {
sum++;
}
}
}
return sum;
}
}
'CodingTest > 백준' 카테고리의 다른 글
[백준] BOJ 2023 신기한 소수 (골드 5) (0) | 2024.04.10 |
---|---|
[백준] BOJ 4485 녹색 옷 입은 애가 젤다지? (골드 4) (1) | 2024.04.10 |
[백준] 그래프와 순회 (24479 : 알고리즘 수업 - 깊이 우선 탐색 1) (0) | 2023.11.03 |
[백준] 그리디 알고리즘 (13305 : 주유소) (0) | 2023.10.26 |
[백준] 그리디 알고리즘 (1541 : 잃어버린 괄호) (0) | 2023.10.25 |