본문 바로가기
알고리즘

[백준] 14719 빗물 - java

by minkang 2021. 6. 29.

https://www.acmicpc.net/problem/14719

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

public class 빗물 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		빗물 service = new 빗물();
		System.out.println(
				service.solution(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), br.readLine()));
	}

	public int solution(int H, int W, String block) {
		int answer = 0;
		StringTokenizer st = new StringTokenizer(block);
		int arr[] = new int[W];
		for (int i = 0; i < W; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		int left, right;
		for (int i = 1; i < arr.length - 1; i++) {
			left = right = arr[i];
			// 왼쪽 벽의 최댓값
			for (int j = 0; j < i; j++) {
				if (left < arr[j])
					left = arr[j];
			}
			// 오른쪽 벽의 최댓값
			for (int j = i + 1; j < arr.length; j++) {
				if (right < arr[j])
					right = arr[j];
			}
			answer += Math.min(left, right) - arr[i];
		}

		return answer;
	}
}

1. 블록을 저장하는 배열을 선언합니다.

2. 양 끝에는 물이 고이지 않습니다.

3. 현재 위치를 기준으로 양쪽벽의 최댓값을 구합니다.

4. left, right의 초기화를 자신을 기준으로 했어서 가장 낮은 벽을 기준으로 빼줍니다.