โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/2512
2512๋ฒ: ์์ฐ
์ฒซ์งธ ์ค์๋ ์ง๋ฐฉ์ ์๋ฅผ ์๋ฏธํ๋ ์ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 3 ์ด์ 10,000 ์ดํ์ด๋ค. ๋ค์ ์ค์๋ ๊ฐ ์ง๋ฐฉ์ ์์ฐ์์ฒญ์ ํํํ๋ N๊ฐ์ ์ ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด ๊ฐ๋ค์ ๋ชจ๋ 1 ์ด์
www.acmicpc.net
โซ๏ธ ๋์ ํ์ด
๋ณด์๋ง์ ์ด์ฝํ ์ฑ ์ ์๋ 'ํ๋ผ๋ฉํธ๋ฆญ ์์น' ๋ฌธ์ ์ ๋ํ์ ํ์ธ๋ฏ ์ถ๋ค. ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋์ง๋ง, ํ์ด๋ฅผ ํ๋ค๊ฐ ํ๊ฐ์ง ๋์น๊ณ ์๊ฐํ ๋ถ๋ถ์ด ์์ด์ ๊ธฐ๋กํ๊ณ ์ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ค.
โพ๏ธ ๋์น๊ณ ์๊ฐํ ๋ถ๋ถ
์ฒ์์ ์๊ฐํ์ ๋, start๋ ์ฃผ์ด์ง ์ง๋ฐฉ์์ฐ์ ์ต์๊ฐ, end ๋ ์ฃผ์ด์ง ์ง๋ฐฉ์์ฐ์ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ๋๊ฒ๊ตฌ๋ ์ถ์ด์ ๊ทธ๋ ๊ฒ ๊ตฌํํ๋ค. ๊ทผ๋ฐ, ์ด๋ ๊ฒ ํ๋๊น ๊ณ์ ํ๋ฆฌ๋ ๊ฒ์ด๋ค! ์ด์ ๊ฐ ๋ญ๊น
์กฐ๊ฑด์์ ์ต์ ํ๊ฐ์ ์ง๋ฐฉ์์ฐ์ ๋ฌด์กฐ๊ฑด ์ถฉ์กฑํด์ผํ๋ค๋ผ๋ ์กฐ๊ฑด์ด ์์ง ์์๊ฐ? ๊ทธ๋ ๋ค. ๊ทธ๋์ start๊ฐ์ 0๋ถํฐ ์์ํ๋๊ฒ ๋ง๋ค. ๋ฐฑ์ค ์์ ์์๋ ๊ตญ๊ฐ ์ด์์ฐ์ ์ง๋ฐฉ์์ฐ๋ค๋ณด๋ค ํฌ๊ฒ ์ฃผ์ด์ก์ง๋ง, ์กฐ๊ฑด์ ์๋ณด๋ฉด ๊ตญ๊ฐ ์ด์์ฐ์ ํ์๋ฆฟ์ ์ผ ์๋ ์๋ค. (์ง๋ฐฉ ๊ฐฏ์๋ณด๋ค ํฌ๋ค๋ ์กฐ๊ฑด์ด๊ธฐ ๋๋ฌธ์ 4๊ฐ์ ์ง๋ฐฉ์ด ์ฃผ์ด์ก๋ค๋ฉด, ๊ตญ๊ฐ์ด์์ฐ์ 4์ผ์๋์๋ค๋ ๊ฒ!)
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ start๋ฅผ 0๋ถํฐ ์์ํด์ผํ๋ค.
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
let n = Int(readLine()!)!
let cities = readLine()!.split(separator: " ").map{ Int($0)! }.sorted(by: <)
let budget = Int(readLine()!)!
func binarySerach(arr: [Int], start: Int, end: Int) -> Int {
var start = start
var end = end
while start <= end {
let mid = start + ((end - start) / 2)
let total = sum(cities: cities, mid: mid)
if budget >= total {
start = mid + 1
} else if budget < total {
end = mid - 1
}
}
return end
}
func sum(cities: [Int], mid: Int) -> Int {
var total = 0
for i in 0..<n {
if mid > cities[i] {
total += cities[i]
} else {
total += mid
}
}
return total
}
print(binarySerach(arr: cities, start: 0, end: cities.max()!))