처음 풀어보는 유형의 문제였다. 매개 변수 탐색을 완벽하게 이해하고 있다면 간단히 풀 수 있는 문제! 대신 반례를 보면서 조건들을 잘 찾아 나가야 한다.
package main
import (
"fmt"
"sort"
)
func main() {
N := 0
need := []int{}
M := 0
fmt.Scan(&N)
sum := 0
for i := 0; i < N; i++ {
input := 0
fmt.Scan(&input)
sum += input
need = append(need, input)
}
fmt.Scan(&M)
sort.Ints(need)
if sum <= M {
fmt.Println(need[N-1])
return
}
start := 0
end := need[N-1]
for start + 1 < end {
mid := (start + end) / 2
sum := 0
for _, v := range need {
if v >= mid {
sum += mid
} else {
sum += v
}
}
if sum > M {
end = mid
} else {
start = mid
}
}
fmt.Println(start)
}
start
값은 0, end
는 요청 금액의 최대값이다.mid
를 넘으면 총합에 상한액을 더하고 그렇지 않으면 원래의 값을 더한다.end
는 mid
가 되고 그렇지 않으면 start
는 mid
가 된다.mid
를 구하면서 start + 1 < end
가 아니게 되는 순간의 start
가 답이다.while
문의 조건을 어떻게 선정해야 하는지 헷갈렸다.start + 1 < end
로 고정end
가 답start
가 답start = mid
, 그렇지 않으면 end = mid
❌
[Algorithm] Binary Search와 Parametric Search