๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ | ๋ฐฑ์ค€/๐Ÿ™‚ | Silver

[Kotlin, S2] ๋ฐฑ์ค€ 18111๋ฒˆ ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ

by immgga 2024. 8. 3.

์ถœ์ฒ˜: unsplash.com

 

๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ(18111๋ฒˆ)

Silver 2

#๊ตฌํ˜„ #๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋ฌธ์ œ ๋‚ด์šฉ

 

 

๋ฌธ์ œ ์ ‘๊ทผ

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋†’์ด๋Š” 0๋ถ€ํ„ฐ 256๊นŒ์ง€์ด๋‹ค.

์ด ๋†’์ด๋ฅผ ์ด์šฉํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์„œ ๋†’์ด๊ฐ€ g ์ผ ๋•Œ ๋†’์ด๊ฐ€ g์ธ ํ‰ํ‰ํ•œ ๋ฐ”๋‹ฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ์ „์— ์ž…๋ ฅ๋œ ๊ฐ’์—์„œ ์–ด๋–ค ๋†’์ด์˜ ๋ธ”๋ก์ด ๋ช‡ ๊ฐœ ๋“ค์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ ๊ฐ’์€ Map์œผ๋กœ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค. key๋ฅผ ๋†’์ด, value๋ฅผ ๊ฐœ์ˆ˜๋กœ ์ •ํ•˜๊ฒ ๋‹ค.

val block = mutableMapOf<Int, Int>()

์ด์ œ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ 0 ~ 256๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ๋Œ์•„ ์ค€๋‹ค.

๋Œ๋ฉด์„œ ๊ธฐ์กด์˜ ์ž…๋ ฅ๊ฐ’์—์„œ ๋†’์ด๊ฐ€ g์ธ ํ‰์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ธ”๋ก์„ ์–ผ๋งˆ๋‚˜ ์บ๊ณ  ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.

๋ธ”๋ก์„ ์บ๋Š” ์ž‘์—…์€ 2์ดˆ๊ฐ€, ๋ธ”๋ก์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ๋Š” 1์ดˆ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

ํ˜„์žฌ g๋ณด๋‹ค map์˜ ๋ธ”๋ก์˜ ๋†’์ด(key)๊ฐ€ ๋” ์ž‘์œผ๋ฉด ๋ธ”๋ก์„ ์„ค์น˜ํ•ด ์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

 

<์กฐ๊ฑด 1>

b.key < g ์ธ ๊ฒฝ์šฐ, 

์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๋ธ”๋ก์˜ ๊ฐœ์ˆ˜๋ฅผ Kotlin ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(g(ํ˜„์žฌ ๋†’์ด) - b.key(๋ธ”๋ก์˜ ๋†’์ด)) * b.value(๋ธ”๋ก์˜ ๊ฐœ์ˆ˜)

์œ„ ์‹์„ ์ ์šฉํ•˜๋ฉด ๋†’์ด๊ฐ€ b.key์ธ ๋ธ”๋ก๋“ค์„ ๋†’์ด g๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฑ„์›Œ์•ผ ํ•˜๋Š” ๋ธ”๋ก์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฒคํ† ๋ฆฌ์—๋Š” ์ฑ„์›Œ์•ผ ํ•˜๋Š” ๋ธ”๋ก๋งŒํผ ๋นผ์ค€๋‹ค.

inventory -= fillCnt

์„ค์น˜ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 1์ดˆ์ด๋ฏ€๋กœ ์‹œ๊ฐ„์€ fillCnt๋งŒํผ ๊ฑธ๋ฆฐ๋‹ค.

time += fillCnt

 

<์กฐ๊ฑด 2>

b.key > g ์ธ ๊ฒฝ์šฐ,

์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๋ธ”๋ก์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(b.key - g) * b.value

์œ„ ์‹์œผ๋กœ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๋ธ”๋ก์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , ์ธ๋ฒคํ† ๋ฆฌ์— ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

inventory += removeCnt

๋ธ”๋ก์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ 2์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— removeCnt * 2๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

time += (removeCnt * 2)

 

<์กฐ๊ฑด 3>

์กฐ๊ฑด 1, 2๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜๊ณ  inventory๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ธ๋ฒคํ† ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๋œป์ด๋ผ g๋งŒํผ์˜ ๋†’์ด๋ฅผ ๊ฐ€์ง„ ํ‰์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— continue.

if (inventory < 0) continue

ํ˜„์žฌ ์ตœ์†Œ ์‹œ๊ฐ„๊ณผ ์ƒˆ๋กœ ๊ตฌํ•œ ์‹œ๊ฐ„๊ณผ ํ˜„์žฌ ์‹œ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ๊ฐ ๊ตฌํ•ด ์ฃผ๊ณ , ๋‘ ๊ฐœ์˜ ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ๋” ์ ์€ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค.

val currentMin = res[0]
val changeMin = min(res[0], time)

 

 

<์กฐ๊ฑด 4>

ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์ƒˆ๋กœ ๊ตฌํ•œ ์ตœ์†Ÿ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ์ตœ์†Ÿ๊ฐ’์ด ์ •ํ•ด์กŒ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

currentMin != changeMin

์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐ ์„ค์ •ํ•œ ๋†’์ด๋ฅผ ์ƒˆ๋กœ ์ ์šฉํ•œ๋‹ค.

 

<์กฐ๊ฑด 5>

๋งŒ์•ฝ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์ƒˆ๋กœ ๊ตฌํ•œ ์ตœ์†Ÿ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด, g๋งŒ ๊ฐฑ์‹ ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.min

fun main() = with (BufferedReader(InputStreamReader(System.`in`))) {
    val (n, m, inv) = readLine().split(" ").map { it.toInt() }
    val block = mutableMapOf<Int, Int>()

    for (i in 0 until n) {
        val blocks = readLine().split(" ").map { it.toInt() }

        for (j in blocks.indices) {
            if (!block.containsKey(blocks[j])) block[blocks[j]] = 1
            else block[blocks[j]] = block[blocks[j]]!! + 1
        }
    }

    var res = listOf(Int.MAX_VALUE, -1)
    for (g in 0 .. 256) {
        // g: ํ˜„์žฌ ๋•…์˜ ๋†’์ด
        var time = 0
        var inventory = inv

        for (b in block) {
            if (b.key < g) {
                // ํ˜„์žฌ ๋•…๋ณด๋‹ค block์˜ ๋†’์ด๊ฐ€ ๋‚ฎ์œผ๋ฉด ์ธ๋ฒคํ† ๋ฆฌ์—์„œ ๋ธ”๋ก์„ ๊บผ๋‚ด์„œ ์ฑ„์›Œ์ฃผ์–ด์•ผ ํ•จ.
                val fillCnt = (g - b.key) * b.value
                inventory -= fillCnt
                time += fillCnt
            } else if (b.key > g) {
                // ํ˜„์žฌ ๋•…๋ณด๋‹ค block์˜ ๋†’์ด๊ฐ€ ๋†’์œผ๋ฉด ํ˜„์žฌ ๋•… ๋†’์ด๊นŒ์ง€ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•ด ์ธ๋ฒคํ† ๋ฆฌ์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•จ.
                val removeCnt = (b.key - g) * b.value
                inventory += removeCnt
                time += (removeCnt * 2)
            }
        }

        if (inventory < 0) continue
        else {
            // ํ˜„์žฌ ์ตœ์†Ÿ๊ฐ’๊ณผ ๋ณ€๊ฒฝ๋œ ์ตœ์†Ÿ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•จ.
            val currentMin = res[0]
            val changeMin = min(res[0], time)

            // ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋” ์ ์€ ์‹œ๊ฐ„์ด ๋“ค์—ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ground ๋„ ๋ณ€๊ฒฝ.
            if (currentMin != changeMin) res = listOf(changeMin, g)
            // ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์ด ๊ฐ™์œผ๋ฉด ๊ฐ€์žฅ ๋†’์€ ๊ฐ’์„ ๊ตฌํ•ด ์ฃผ์–ด์•ผ ํ•จ.
            else if (currentMin == time) res = listOf(currentMin, g)
        }
    }

    println(res.joinToString(" "))
}

 

๋ฌธ์ œ ํ’€์ด

์ž…๋ ฅ๊ฐ’์„ ๋ชจ๋‘ map์— ์ €์žฅํ•ด ์ค€๋‹ค. key์—๋Š” block์˜ ๋†’์ด๊ฐ€, value์—๋Š” block์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

0๋ถ€ํ„ฐ 256๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ map์—์„œ ์กฐ๊ฑด 1๊ณผ ์กฐ๊ฑด 2๋ฅผ ์ ์šฉํ•ด ๋‚จ์€ ์ธ๋ฒคํ† ๋ฆฌ์™€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๊ตฌํ•ด ์ค€๋‹ค.

for (b in block) {
    if (b.key < g) {
        // ํ˜„์žฌ ๋•…๋ณด๋‹ค block์˜ ๋†’์ด๊ฐ€ ๋‚ฎ์œผ๋ฉด ์ธ๋ฒคํ† ๋ฆฌ์—์„œ ๋ธ”๋ก์„ ๊บผ๋‚ด์„œ ์ฑ„์›Œ์ฃผ์–ด์•ผ ํ•จ.
        val fillCnt = (g - b.key) * b.value
        inventory -= fillCnt
        time += fillCnt
    } else if (b.key > g) {
        // ํ˜„์žฌ ๋•…๋ณด๋‹ค block์˜ ๋†’์ด๊ฐ€ ๋†’์œผ๋ฉด ํ˜„์žฌ ๋•… ๋†’์ด๊นŒ์ง€ ๋ธ”๋ก์„ ์ œ๊ฑฐํ•ด ์ธ๋ฒคํ† ๋ฆฌ์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•จ.
        val removeCnt = (b.key - g) * b.value
        inventory += removeCnt
        time += (removeCnt * 2)
    }
}

๊ฑธ๋ฆฐ ์‹œ๊ฐ„๊ณผ ๋‚จ์€ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ๊ตฌํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์กฐ๊ฑด 3์„ ํ†ตํ•ด ํ‰์ง€ g๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด continue๋กœ ๊ฑด๋„ˆ๋›ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์กฐ๊ฑด 4, ์กฐ๊ฑด 5๋ฅผ ์ฒดํฌํ•ด์„œ ๊ฒฐ๊ด๊ฐ’์„ ๋ณ€๊ฒฝํ•ด ์ค€๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

๋†’์ด๋ฅผ 0๋ถ€ํ„ฐ 256์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ตœ์†Œ ์‹œ๊ฐ„๊ณผ ์ตœ์†Œ ์‹œ๊ฐ„์— ํ•ด๋‹นํ•˜๋Š” ๋†’์ด๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋ฌธ์ œ ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์—์„œ๋Š” ์™„์ „ ํƒ์ƒ‰์„ ์ด์šฉํ–ˆ๋‹ค๋Š” ๊ฒŒ์‹œ๋ฌผ์ด ์ข…์ข… ๋ณด์—ฌ์„œ ์ด๋ ‡๊ฒŒ ์‰ฌ์šด ํ’€์ด๋ฒ•์„ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค.

์ œํ•œ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€ ์‹œ๊ฐ„์ด ์—†๋Š” 1์ดˆ๋ผ์„œ ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋Œ๊ณ  ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ๋‹ค.

Map์„ ์ด์šฉํ•ด ํ•ด๋‹น ๋†’์ด์— ๋ธ”๋ก์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์–ด์•ผ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

728x90