ALGORITHM

[백준] 14719번 빗물

SZCODE 2020. 10. 24. 22:51

www.acmicpc.net/problem/14719

 

14719번: 빗물

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

www.acmicpc.net

문제 설명 : 빗물의 총량 구하기

문제 풀이 : 
arr 배열은 블록이 쌓인 높이를 담고 있다.
빗물이 고이는 조건(양 옆이 자신 보다 클 경우)을 만족시키기 위해,
arr 배열을 반복해서 돌면서 해당 인덱스의 왼쪽에서 가장 큰 숫자를 left에 오른쪽에서 가장 큰 숫자를 right에 저장한다.

이후 빗물이 고이는 양(두개의 블록 중 작은 블록까지 빗물이 채워짐)을 구하기 위해
left 와 right 중 작은 숫자를 구한다.

최종적으로 작은 블록 크기에서 해당 인덱스 크기를 빼면 빗물이 고인 용량이 나오고 answer 변수에 계속 갱신해준다.

주의할 점 : left right 변수 초기화
import java.util.Scanner;

public class Main{
	static int H,W;
	static int[] arr;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		H = sc.nextInt();
		W = sc.nextInt();
		arr = new int[W];
		int answer = 0;
		
		for (int i = 0; i < W; i++) {
			arr[i] = sc.nextInt();
		}
		
		
		for (int i = 1; i < W; i++) {
			int left=-1, right=-1, min = 0, result =0;

			//현재 인덱스에서 왼쪽에서 가장 큰 숫자구하기
			for (int j = i; j >= 0; j--) left = Math.max(arr[j], left);
            //현재 인덱스에서 오른쪽에서 가장 큰 숫자 구하기
			for (int j = i; j < W; j++)	right = Math.max(arr[j], right);
			
            //둘 중 작은 숫자 - 현재 인덱스 숫자-> 결과에 더하기
			min = Math.min(left, right);
			result = min - arr[i];
			answer += result;
		}
				
		System.out.println(answer);
	}
}

 

'ALGORITHM' 카테고리의 다른 글

[백준] 2798번 블랙잭 java  (0) 2022.10.25