Problem Solving/백준

[18111] 마인크래프트

충무로술겜마 2021. 7. 7. 14:54

https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

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

www.acmicpc.net

모든 좌표 더한 값 + 가지고 있는 블록 개수를 가로*세로 로 나눠서 평균을 내보면 그 값보다 높은 높이의 값을 결과값으로 가질 수 없기 때문에 이를 바탕으로 조금 더 효율적으로 계산할 수 있습니다.

 

그리고 제발... 버퍼드리더를 생활화합시다... 저는 바보였어요

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
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.StringBuilder
import java.util.*
 
fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val (n, m, b) = br.readLine().split(" ").map { it.toInt() }
    var minTime = Int.MAX_VALUE
    var minTimeHeight = 0
    var sum:Long = 0
    val arr = Array<Array<Int>>(n) { Array<Int>(m) { 0 } }
    // 좌표 값 입력
    for(i in 0 until n){
        val st = StringTokenizer(br.readLine(), " ")
        for(j in 0 until m){
            arr[i][j] = Integer.parseInt(st.nextToken())
            sum += arr[i][j]
        }
    }
    val average:Long = (sum+b)/(n*m)
    maxHeight = if (average>256)256 else average.toInt()
    for(targetHeight in 0..maxHeight){
        var time = 0
        for(l in 0 until n){
            for(z in 0 until m){
                if (arr[l][z] > targetHeight){
                    time += (arr[l][z] - targetHeight) * 2
                }else if (arr[l][z] < targetHeight){
                    time += targetHeight-arr[l][z]
                }
            }
        }
        if(minTime >= time){
            minTime = time
            minTimeHeight = targetHeight
        }
    }
 
    val sb = StringBuilder()
    sb.append("$minTime").append(" $minTimeHeight")
    print(sb)
}
 
cs