본문 바로가기

CodingTEST

[백준 18111] 마인크래프트 (JAVA)

반응형

백준 18111번 문제 - 마인크래프트

 

18111번: 마인크래프트

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

www.acmicpc.net


문제 분석

 

 

 

  • 입력받은 땅을 똑같은 높이로 만들어야 한다.
    • 땅의 크기 (N*M)
  • 땅을 다듬는 방법과 시간소요는 다음과 같다.
    • 1초 : 좌표 (i, j)의 가장 위에 있는 블록을 제거하여 인벤토리에 넣는다.
    • 2초 : 인벤토리에서 블록 하나를 꺼내어 좌표 (i, j)의 가장 위에 있는 블록 위에 놓는다.
  • 인벤토리에 담겨진 블록은 B개이다.
  • 이때 땅을 고르게 만드는데 가장 짥은 소요 시간과 그 당시 땅의 높이 출력
    • 답이 여러개일 경우, 가장 높은 높이를 출력

 

해결 키 포인트

 

  • 방법 1 : 는 땅의 높이의 평균을 구해 평균과 평균+1로 땅을 다듬을 때 시간 중 작은 시간으로 처리
    • 실패 ! 1퍼센트도 되지 못했다.
  • 방법 2 : 가장 작은 땅 크기 부터 큰 땅 크기까지 모든 소요 시간을 구해 가장 작은 시간으로 처리 
    • 성공 ! 시간초과를 고려서 1번 방법을 선택하였지만, 시간은 넉넉했다.
  • 인벤토리가 모자랄 경우 처리 : 인벤토리에 넣고 빼는 작업을 일단 반복 후, 마지막에 0보다 인벤토리 속 블록 수가 작은지 확인
  • 초기 시간 값은  99999999로 ! (가장 큰 수)
  • 두 높이의 소요 시간이 동일 할 경우, 높이가 큰 것으로 한다 !

 

코드

 

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

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[][] nums = new int[N][M];
        int min = 0, max = 257;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                nums[i][j] = Integer.parseInt(st.nextToken());
                min = Math.min(min, nums[i][j]);
                max = Math.max(max, nums[i][j]);
            }
        }

        int resultFloor = 0;
        int resultTime = 99999999;
        for (int floor = min; floor <= max; floor++) {
            int b = B;
            int newTime = 0;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (floor > nums[i][j]) {
                        b -= floor - nums[i][j];
                        newTime += floor - nums[i][j];
                    } else if (floor < nums[i][j]) {
                        b += nums[i][j] - floor;
                        newTime += ((nums[i][j] - floor) * 2);
                    }
                }
            }
            if(b < 0) {
                break;
            }
            if(newTime <= resultTime) {
                resultTime = newTime;
                resultFloor = floor;
            }
        }

        System.out.println(resultTime + " " + resultFloor);
    }
}
반응형

'CodingTEST' 카테고리의 다른 글

[백준 2108] 통계학 (JAVA)  (1) 2023.11.30
[백준 1654] 랜선 자르기 (JAVA)  (4) 2023.11.24
[백준 14503] 로봇 청소기 (JAVA)  (0) 2023.11.23
[백준 2573] 빙산 (JAVA)  (0) 2023.11.23
[백준 2468] 안전 영역 (JAVA)  (0) 2023.11.23