땅의 최소높이, 최대높이를 구해둔다. 
목표 높이 h 를 최소높이 부터 최대 높이 까지 도는 반복문을 만든다. 
반복문 안에서 모든 땅을 h로 만들기 위해 걸리는 시간을 구한다. 
반복문 안에 필요한 지역변수는 inven 과 time 이다. 
 
반복문 한 바퀴가 끝났을 때 인벤이 음수라면, 실패니까 지나간다. 
인벤이 0이상이라면, 최소 시간일 때 시간을 갱신한다. 또한 같은 시간이라도, 땅의 높이가 더 높다면 땅의 높이를 갱신해준다. 
#include <bits/stdc++.h>
using namespace std;

int n, m, b;
int min_height = 256, max_height = 0;
int min_time = 1e9, block_height = 0;
int ground[502][502];

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n >> m >> b;

  for(int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기
      cin >> ground[i][j];
      min_height = min(min_height, ground[i][j]);
      max_height = max(max_height, ground[i][j]);
    }
  }

  // 목표 높이 h : 최소 높이~ 최대 높이 모두 검사한다.
  for(int h = min_height; h <= max_height; h++){
    int temp_time = 0;
    int inven = b;
    int diff = 0;  // 목표높이 h와 현재 땅의 높이 차이

    for(int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) { // 블록의 최소 높이와 최대 높이 구하기

        diff = abs(ground[i][j] - h);
        if(ground[i][j] < h) {  // 낮다면, 시간 2씩 더하고, 인벤에서 꺼내서 쌓아준다
          temp_time += diff;
          inven -= diff;
        }
        else if (ground[i][j] > h){ // 높다면, 시간 1씩 더하고, 인벤에 옮긴다
          temp_time += (2 * diff);
          inven += diff;
        }
      }
    }
    if(inven >= 0){ 
      min_time = min(min_time, temp_time);
      // 답이 여러 개 있다면 그중에서 땅의 높이가 가장 높은 것을 출력
      if(temp_time == min_time) block_height = max(block_height, h);
    }
  }

  cout << min_time << " " << block_height; 

  return 0;
}
 
728x90

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

좌표 압축 백준 18870번 c++  (0) 2022.02.16
수 정렬하기 2 백준 2751번 c++  (0) 2022.02.16
방 번호 백준 1475번 c++  (0) 2022.02.14
영화감독 숌 백준 1436번 c++  (0) 2022.02.14
랜선 자르기 백준 1652번 c++  (0) 2022.02.14

+ Recent posts