🟦/백준

[실버 2] 마인크래프트

진뚱이용 2023. 5. 30. 15:20

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

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net

처음에 입력이 고른 땅인 경우를 생각 안 해서 틀렸었다

import java.io.*;
import java.util.*;

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

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        int[][] arr = new int[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        ///////////////////////////////////////////////////////////////

        // index = 높이
        // 해당 높이로 만들었을 경우 걸리는 시간을 모두 저장하자
        // 0초 걸리고 평탄화도 가능하므로 -1로 초기화 해주기
        int[] answer = new int[257];
        for (int i = 0; i <= 256; i++)
            answer[i] = -1;

        // 바보같이 땅의 최저 높이보다 더 파내서 시간이 더 걸려?
        int min_height = Integer.MAX_VALUE;
        // 바보같이 땅의 최고 높이보다 더 붙여서 시간이 더 걸려?
        int max_height = Integer.MIN_VALUE;

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                min_height = Math.min(min_height, arr[i][j]);
                max_height = Math.max(max_height, arr[i][j]);
            }
        }

        for (int height = min_height; height <= max_height; height++) {
            // 각 높이에 쓸 인벤토리 벽돌
            int tmp_B = B;
            int time = 0;

            // 땅 먼저 파거나 채워넣는 건 순서 별로 상관 없다
            // 땅 파
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (arr[i][j] > height) {
                        tmp_B = tmp_B + (arr[i][j] - height);
                        time = time + 2 * (arr[i][j] - height);
                    }
                }
            }

            // 땅 채워넣어
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (arr[i][j] < height) {
                        tmp_B = tmp_B - (height - arr[i][j]);
                        time = time + 1 * (height - arr[i][j]);
                    }
                }
            }

            // 해당 높이로 맞추는 작업을 했는데 벽돌이 부족했네
            // 그럼 그 높이는 못 맞추는거지
            if (tmp_B >= 0) {
                answer[height] = time;
            }

        }

        int height = -1;
        int time = Integer.MAX_VALUE;

        for (int i = 0; i <= 256; i++) {
            if (answer[i] != -1 && answer[i] <= time) {
                height = i;
                time = answer[i];
            }
        }

        System.out.println(time + " " + height);

    }
}