문제 링크: https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
첫 번째 시도 (틀렸습니다.)
// ex) 120, 110, 150, 140
// 국가 예산: 485
// 1. 정렬 110, 120, 140, 150
// 2. 국가 예산 개수로 나누기 : 121
// 3. 각 지방 예산이 121보다 낮을 경우, 그 차이를 더해주기
// (121 - 110) + (121 - 120) = 12
// 4. 121보다 큰 지방 예산의 개수로 나눠주기: 12 / 2 = 6
// 5. 답: 121 + 6 = 127
package fourtyfirst
import java.io.*
import java.math.BigInteger
fun main(){
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
val list = br.readLine().split(' ').map{it.toInt()}.sorted()
val price = br.readLine().toInt()
var sum = list.sum()
// 총 더한 금액이 국가 예산보다 작거나 같을 때
if (price >= sum){
// 최대값 출력
println(list.max())
}
else{
val a = price / n
var s = 0
var max = 0
for (index in list.indices){
if (list[index] <= a)
s += a - list[index]
if (list[index] > a){
val diff = list.size - index
if (s % 2 == 0)
max = a + s / diff
else
max = a + s / diff + 1
break
}
}
println(max)
}
}
그냥 논리가 틀렸습니다.
유형을 봤고, 이분 탐색으로 풀었습니다.
두 번째 시도 (맞았습니다.)
package fourtyfirst
import java.io.*
import java.math.BigInteger
fun main(){
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
val list = br.readLine().split(' ').map{it.toInt()}
val price = br.readLine().toInt()
var start = 0
var end = list.max()
if (list.sum() <= price)
println(list.max())
else{
while (start <= end){
val mid = (end + start) / 2
var totalBudget = price
for (index in list.indices){
if (list[index] > mid)
totalBudget -= mid
else
totalBudget -= list[index]
}
if (totalBudget >= 0){
start = mid + 1
}
else
end = mid - 1
}
println(end)
}
}
'알고리즘 > 매일마다 풀기(백준)' 카테고리의 다른 글
구현 문제만 풀어보기 (0) | 2023.05.12 |
---|---|
[2023-05-10] 1182 부분 수열의 합 (Kotlin) + 8 문제 (1) | 2023.05.10 |
[2023-05-09] 24479 알고리즘 수업 - 깊이 우선 탐색 1 (Kotlin) + 7문제 (0) | 2023.05.09 |
[2023-05-08] 1735 분수 합(Kotlin) + 4문제 (0) | 2023.05.08 |
[2023-05-07] 28015 영역 색칠 (Kotlin) (0) | 2023.05.07 |
댓글