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

Greenddoovie·2021년 12월 10일
0

백준

목록 보기
3/30

18111번 마인크래프트

접근방법

각 좌표마다 동일한 층이 존재할 수 있으므로 map을 이용해서 <높이, 좌표개수>를 저장한다
답 변수로 <최소 시간, 높이>를 지정한 뒤
가능한 높이(0..256)까지 돌면서 필요한 최소시간을 계산

import java.io.BufferedReader
import java.io.InputStreamReader

val br = BufferedReader(InputStreamReader(System.`in`))

fun main() {
    val (r,c,inventory) = br.readLine().trim().split(" ").map{ it.toInt() }
    val map: HashMap<Int, Int> = hashMapOf()
    var ans = Pair(Int.MAX_VALUE, -1)
    // Get graph && total # of given block get
    allocMapElement(map, r)
    (0..256).forEach { h -> 
        var build = 0
        var remove = 0
        map.keys.forEach { key ->
            val value = map[key]!!
            if (h - key > 0) {
                build += (h - key) * value
            } else if (h - key < 0) {
                remove += (key - h) * value
            }
        }
        if (remove + inventory >= build) {
            val time = (2 * remove) + build
            if (time <= ans.first) {
                ans = Pair(time, h)
            }
        }         
    }
    println("${ans.first} ${ans.second}")
     
}

fun allocMapElement(map: HashMap<Int, Int>, r: Int) {
    repeat(r) {
        br.readLine().trim().split(" ").forEach {
            it.toInt().also { it ->
                if (map.containsKey(it)) {
                    map[it] = map[it]!! + 1
                } else {
                    map[it] = 1
                }
            }
        }
    }
}
profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글