Baekjoon Review

[Silver 2] 18111 마인크래프트

hanseongbugi 2024. 8. 22. 15:02

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

 

N x M 크기의 땅 정보를 입력 받을 때 최소 높이의 블록과 최대 높이 블록을 구한다.

이후 최소 높이에서 최대 높이까지 땅 높이를 조사한다.

현재 높이에서 arr배열 속 땅 정보가 크면 땅을 판다.

또한 현재 높이에서 arr배열 속 땅 정보가 작으면 땅을 채운다.

 

#include <iostream>
#include <cmath>
using namespace std;

int N, M, B;
int arr[501][501];
int minBlock = 257, maxBlock = 0;
int answer = 987654321, height = -1;

void dfs(int h, int b){
    int t = 0;

    for(int i = 0;i<N;i++){
        for(int j = 0;j<M;j++){
            if(arr[i][j] > h){
                b += arr[i][j] - h;
                t += 2 * (arr[i][j] - h);
            }
        }
    }
    for(int i = 0;i<N;i++){
        for(int j = 0;j<M;j++){
            if(arr[i][j] < h){
                b -= h - arr[i][j];
                t += 1 * (h - arr[i][j]);
            }
        }
    }
    if(b >= 0){
        answer = min(answer, t);
        if(answer == t)
            height = max(height, h);
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
	cin>>N>>M>>B;

    for(int i = 0;i<N;i++){
        for(int j = 0;j<M;j++){
            cin>>arr[i][j];
            minBlock = min(arr[i][j], minBlock);
            maxBlock = max(arr[i][j], maxBlock);
        }
    }
    for(int i = minBlock; i<=maxBlock;i++)
        dfs(i,B);

    cout<<answer<<' '<<height<<'\n';
}