Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[백준] 18111 - 마인크래프트 본문

알고리즘

[백준] 18111 - 마인크래프트

JH_Lucid 2021. 6. 17. 16:43

입력 시, 최대 높이를 받는다. 해당 높이부터 0까지 가장 짧은 시간을 구한 후, 마지막에 출력한다.

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

class Answer {
    int time;
    int height;

    public Answer(int time, int height) {
        this.time = time;
        this.height = height;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer 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];
        int m_height = 0;
        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());
                m_height = Math.max(m_height, arr[i][j]);
            }
        }

        int min_time = Integer.MAX_VALUE;

        //시간을 최소로, 같을 경우 최대 높이로
        Answer answer = new Answer(min_time, 0);

        while (m_height >= 0) {
            int rm = 0;
            int ad = 0;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (arr[i][j] < m_height) {
                        ad += m_height - arr[i][j];
                    }
                    if (arr[i][j] > m_height) {
                        rm += arr[i][j] - m_height;
                    }
                }
            }
            int all_block = B + rm - ad;
            if (all_block >= 0) {
                int time = (rm * 2) + (ad);
                
                if (time < answer.time) {
                    answer = new Answer(time, m_height);
                }
                if (time == answer.time) {
                    if (m_height > answer.height) {
                        answer = new Answer(time, m_height);
                    }
                }
            }
            m_height--;
        }
        System.out.println(answer.time + " " + answer.height);
    }
}

'알고리즘' 카테고리의 다른 글

[백준] 1654 - 랜선 자르기  (0) 2021.06.18
[백준] 2805 - 나무 자르기  (0) 2021.06.17
[백준] 11866 - 요세푸스 문제 0  (0) 2021.06.17
[백준] 2798 - 블랙잭  (0) 2021.06.16
[백준] 2609 - 최대공약수와 최소공배수  (0) 2021.06.16
Comments