Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 2512๋ฒˆ - ์˜ˆ์‚ฐ (์ด๋ถ„ํƒ์ƒ‰, ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜)

๊ฐ์ž ๐Ÿฅ” 2023. 3. 17. 17:22
๋ฐ˜์‘ํ˜•

 

โšซ๏ธ ๋ฌธ์ œ

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()!))
๋ฐ˜์‘ํ˜•