오늘 하루, develop

백준 14719번 - 빗물 (java) 본문

알고리즘

백준 14719번 - 빗물 (java)

toZoe 2024. 7. 11. 00:42

💡 문제 링크

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

 

💡 아이디어

2차원 배열을 활용해서 풀이를 설계했는데 입력값을 보고, 더 좋은 풀이가 있겠다는 생각이 들었다.

입력이 2차원 배열이 아닌, 높이의 1차원 배열이었기 때문이다.

그러나 주어진 조건과 범위를 확인했을 때 2차원 배열로도 충분히 해결이 가능할 것이라고 판단하여 그대로 진행 후, 다른 풀이도 확인했다.

  • 2차원 배열 생성
  • 블록이 있는 칸에는 1, 없는 칸에는 0 저장
  • 행 별로 칸을 확인
  • 해당 행에 첫 블록을 만나면 start를 true로 처리
  • 첫 블록을 만난 이후 (start=true)
    1. 1) 빈칸을 만나면, 빗물이 고일 수 있는 공간이므로 count 증가
    2. 2) 블록을 만나면, 지금까지의 빗물 저장, count 초기화
  • 다음 행에서는 start와 count 모두 초기화

 

💡 코드

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

public class BOJ_G5_14719_빗물 {
    static int H, W;
    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        H = Integer.parseInt(st.nextToken());
        W = Integer.parseInt(st.nextToken());

        map = new int[H][W];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < W; i++) {
            fill(i, Integer.parseInt(st.nextToken()));
        }

        int result = 0; //빗물의 총량
        for (int i = 0; i < H; i++) {
            boolean start = false; //이번 행에서 블록을 만난 적이 있는지 체크
            int count = 0; //이번 행에서 빗물이 고이는 칸 수
            for (int j = 0; j < W; j++) {
                if (!start && map[i][j] == 1) { //이번 행에서 블록을 처음 만난 경우
                    start=true;
                }
                else if (start && map[i][j] == 0) { //빗물이 고일 수 있는 공간
                    count++;
                }
                else if (start && map[i][j] == 1) { //이미 블록을 만난 후 또 다른 블록을 만난 경우 빗물 저장
                    result += count; //빗물 저장
                    count = 0; //빗물이 고이는 칸 초기화
                }
            }
        }
        System.out.println(result);
    }

    //map을 채우는 함수
    public static void fill(int col, int num) {
        for (int i = 1; i <= num; i++) {
            map[H - i][col] = 1;
        }
    }
}