알고리즘/백준
[Java] 백준 빗물
문바리
2022. 12. 31. 00:22
728x90
1. 문제 분석
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
가로와 세로가 주어지고 각 가로셀마다 높이가 주어진다.
그때 빗물이 몇개 고이는지 확인하는 문제다.
백준에 있는 힌트다. 여기서 가로 기준으로 잘 보면 규칙이 있다.
파란색으로 칠한 부분을 보면 된다. 검은색을 0, 하얀색을 1로 생각해보자.
첫째줄은 0 1 0 0이 된다. 빗물은 1칸 채워진다.
둘째줄은 0 1 1 0이 된다. 빗물은 2칸 채워진다.
셋째줄은 0 1 1 0이 된다. 빗물은 2칸 채워진다.
넷째줄은 0 0 0 1이 된다. 빗물은 0칸 채워진다.
즉, 0과 0 사이에 있는 1의 개수를 세면 된다.
2. 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
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 height = Integer.parseInt(st.nextToken());
int width = Integer.parseInt(st.nextToken());
int[][] info = new int[width][height];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < width; i++) {
int size = Integer.parseInt(st.nextToken());
for (int j = 0; j < size; j++) {
info[i][j] = 1;
}
}
int answer = 0;
for (int i = 0; i < height; i++) {
boolean flag = false;
int pos = 0;
for (int j = 0; j < width; j++) {
if (info[j][i] == 1) {
if (flag) answer += j - pos - 1;
else flag = true;
pos = j;
}
}
}
System.out.println(answer);
}
}
따로 설명할게 없다. 위에 말한대로 구현하면 끝이다.
반응형