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

빨대씹는버릇있음·2023년 3월 23일

백준 실버

목록 보기
13/25

높이가 0일때 ~ 256일때의 경우의 수를 모두 계산하면 된다.

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 [] height = new int[257];  //높이에 따른 개수 (ex. 높이 0: 11개, 1: 1개)
		for(int i=0; i<n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0; j<m; j++) {
				int a = Integer.parseInt(st.nextToken());
				height[a]++;
			}
		}

		int time = 256*2*500*500;
		int max_height = 0;
		for(int i=0; i<257; i++) {  //높이가 0일때, 1일때, 2일때, ..., 256일 때 
			int tmp = 0;
			int block = b;
			for(int j=0; j<257; j++) {
				if(height[j] > 0) {  //높이가 존재하는 경우에만
					if(j > i) {
						tmp += ((j-i)*height[j]*2);
						block += ((j-i)*height[j]);
					}
					else if(j < i) {
						tmp += ((i-j)*height[j]);
						block -= ((i-j)*height[j]);
					}
				}
			}	
			
			if(block >= 0 && time > tmp) {
				time = tmp;
				max_height = i;
			}
			else if(block >= 0 && time == tmp) {
				max_height = Math.max(max_height, i);
			}
		}
		
		System.out.println(time + " " + max_height);
		
		
	}	
}

2023-03-23

0개의 댓글