๋ง์ธํฌ๋ํํธ(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์ ์ด์ฉํด ํด๋น ๋์ด์ ๋ธ๋ก์ด ๋ช ๊ฐ ์๋์ง ํ์ธํด ์ฃผ์ด์ผ ๋ ๋น ๋ฅด๊ฒ ๊ฐ์ ๊ตฌํ ์ ์๋ค.
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S2] ๋ฐฑ์ค 30804๋ฒ ๊ณผ์ผ ํํ๋ฃจ (0) | 2024.08.05 |
---|---|
[Kotlin, S2] ๋ฐฑ์ค 21736๋ฒ ํ๋ด๊ธฐ๋ ์น๊ตฌ๊ฐ ํ์ํด (0) | 2024.08.04 |
[Kotlin, S3] ๋ฐฑ์ค 31409๋ฒ ์ฐฉ์ ์ ํ ์๋ (0) | 2024.08.02 |
[Kotlin, S4] ๋ฐฑ์ค 25184๋ฒ ๋๊ฐ์์ด ๊ตฌํ๊ธฐ (0) | 2024.08.01 |
[Kotlin, S5] ๋ฐฑ์ค 30923๋ฒ ํฌ๋๊ณผ 3D ํ๋ฆฐํฐ (0) | 2024.08.01 |