14719번 : 빗물 [Java]

2021. 5. 6. 23:26Algorithm/백준

반응형

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

 

14719번: 빗물

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

www.acmicpc.net

해결 방안

제일 아래 줄에서부터 블록이 아니라면 양옆으로 한 칸씩 전진하며 블록으로 막힐 수 있는지 찾는다. 양 쪽에 블록이 다 있다면 그 칸을 빗물로 채운다. 다 살핀 후 빗물 양을 센다.

 

아쉬운 점

풀고 다른 사람들 코드를 보니 같은 느낌인데 훨씬 간단하게 푼 분이 많았다... 너무 복잡하게 생각했나...

 

전체 코드

import java.util.Scanner;

public class Main {
	static int H, W;
	static int[][] map;
	static int ans = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		H = sc.nextInt(); // 세로
		W = sc.nextInt(); // 가로
		map = new int[H][W];
		for (int j = 0; j < W; j++) {
			int block = sc.nextInt();
			for (int i = H - 1; i >= H - block; i--) {
				map[i][j] = 1;
			}
		}

		for (int h = H - 1; h >= 0; h--) {
			rain(h);
		}

		calc();
		System.out.println(ans);
	}

	private static void calc() {
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (map[i][j] == 2)
					ans++;
			}
		}
	}

	private static void rain(int h) {
		for (int j = 0; j < W; j++) {
			if (map[h][j] == 0) {
				boolean left = false;
				int temp = j;
				while (true) {
					temp -= 1;
					if (temp < 0)
						break;
					if (map[h][temp] == 1) {
						left = true;
					}
				}
				boolean right = false;
				temp = j;
				while (true) {
					temp += 1;
					if (temp >= W)
						break;
					if (map[h][temp] == 1) {
						right = true;
					}
				}
				if (left && right)
					map[h][j] = 2;
			}
		}
	}
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

20115번 : 에너지드링크 [Java]  (0) 2021.05.12
13023번 : ABCED [Java]  (0) 2021.05.06
2636번 : 치즈 [Java]  (0) 2021.04.28
2143번 : 두 배열의 합 [Java]  (0) 2021.04.27
7453번 : 합이 0인 네 정수 [Java]  (0) 2021.04.27