[Java] 백준 / 마인크래프트 / 18111번

정현명·2022년 2월 21일
0

baekjoon

목록 보기
67/180

[Java] 백준 / 마인크래프트 / 18111번

문제

마인크래프트 문제 링크

접근 방식

블럭 높이 값 중 가장 낮은 값부터 가장 큰 값까지의 범위 내에 블럭이 0 이상 남으면서 평지를 만드는 경우를 찾는다

해당 경우 중 시간이 짧으면서 높이가 가장 높은 것을 출력한다



코드

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

public class Main_18111 {

	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 mat[][] = new int[N][M];
		
		int max = 0;
		int min = 257;
		
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				mat[i][j] = Integer.parseInt(st.nextToken());
				max = Math.max(max, mat[i][j]);
				min = Math.min(min, mat[i][j]);
			}
		}
		
		int floorMax = min;
		int timeMin = Integer.MAX_VALUE;
		
		for(int i=min;i<=max;i++) {
			int time = 0;
			int block = B;
			for(int r=0;r<N;r++) {
				for(int c=0;c<M;c++) {
					if(mat[r][c] > i) {
						time += 2* (mat[r][c] - i); 
						block += mat[r][c] - i;
					}
					else if(mat[r][c] < i) {
						time += i - mat[r][c];
						block -= i - mat[r][c];
						
					}
				}
			}
			
			
			if(block >= 0 && time <= timeMin) {
				if(time == timeMin) {
					floorMax = floorMax > i ? floorMax : i;
				}
				else {
					floorMax = i;
					timeMin = time;
				}
			}
		}
		
		System.out.println(timeMin + " " + floorMax);
		
		
		
	}

}
profile
꾸준함, 책임감

0개의 댓글