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()!))
λ°˜μ‘ν˜•