백준 풀이/자바(Java)

백준 18111 자바 - 마인크래프트

콘스_ 2024. 5. 1. 15:07
// 마인크래프트
package Silver_II_2;

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

public class Ex18111 {
    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[][] ground = new int[n][m];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                ground[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 땅의 높이별 걸리는 시간 계산
        int[] timeByHeight = new int[257];
        int minTime = Integer.MAX_VALUE;
        String stringMinTime = "";
        for (int i = 0; i < timeByHeight.length; i++) {
            int totalB = b; // 초기 인벤토리 블록 개수

            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    if (i < ground[j][k]) { // 블록 제거, 인벤토리에 넣는다.
                        timeByHeight[i] += (ground[j][k] - i) * 2; // 1번 작업 방식
                        totalB += (ground[j][k] - i); // 제거한 블럭 인벤토리에 추가
                    } else if (i > ground[j][k]) { // 블록 놓기, 인벤토리에서 꺼낸다.
                        timeByHeight[i] += (i - ground[j][k]); // 2번 작업 방식
                        totalB -= (i - ground[j][k]);
                    }
                }
            }

            if (totalB < 0) { // 인벤토리 블럭 수가 음수면 그 높이는 불가능
                timeByHeight[i] = Integer.MAX_VALUE;
            }

            if (timeByHeight[i] <= minTime) { // 최소 시간 중 최대 높이 구함
                stringMinTime = timeByHeight[i] + " " + i;
                minTime = timeByHeight[i];
            }
        }

        System.out.println(stringMinTime);
    }
}

이번 문제는 상당히 오래 걸렸다. 다른 방식도 했었지만, 오히려 단순하게 하니 풀렸다