공부공간

BOJ - 14719 ) 빗물 본문

알고리즘/구현,시뮬

BOJ - 14719 ) 빗물

개발자가될수있을까? 2020. 10. 26. 16:48


www.acmicpc.net/problem/14719

 

14719번: 빗물

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

www.acmicpc.net


모 기업 코딩테스트에서 출제되었던 문제이다. 

 

배열의 앞,뒤로 탐색하면서 나보다 큰 벽을 만났을때, 그 중간 벽들과의 차이를 더해준다.

 

시간복잡도 O(2*500)으로 처리가능하다


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 빗물 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int h = Integer.parseInt(st.nextToken());
		int w = Integer.parseInt(st.nextToken());
		int num[] = new int[w];
		st = new StringTokenizer(br.readLine());
		for(int i =0; i < w; i++) num[i] = Integer.parseInt(st.nextToken());
		
		int answer = 0;
		int s = 0;
		int maxidx = 0;
		
		for(int i=1 ; i < w ; i++) {
			if(num[i] >= num[s]) {
				if(i==s+1) {
					s =i;
					continue;
				}
				// i 부터 s 까지
				for(int j = s ; j < i ; j++) {
					answer += (num[s]-num[j]);
					num[j] = num[s];
				}
				s = i;
			}
		}
		
		s = w-1;
		for(int i= w-2; i>=0 ; i--) {
			if(num[i] >= num[s]) {
				if(i==s-1) {
					s =i;
					continue;
				}
				for(int j = s ; j > i ; j--) {
					answer += (num[s]-num[j]);
					num[j] = num[s];
				}
				s = i;
			}
		}
		System.out.println(answer);
	}
}

 

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

BOJ - 11003 ) 최솟값 찾기  (0) 2021.03.10
BOJ - 18870 ) 좌표압축  (0) 2020.11.24
BOJ - 17837 ) 새로운게임 2  (0) 2020.10.16
BOJ - 17140 ) 이차원 배열과 연산  (1) 2020.09.14
BOJ - 14499 ) 주사위 굴리기  (0) 2020.09.07
Comments