Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 10816๋ฒˆ - ์ˆซ์ž์นด๋“œ2 (์ด๋ถ„ํƒ์ƒ‰, upper bound, lower bound)

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

์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ๋•Œ๋Š” ์กด์žฌ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ• ๋•Œ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ, ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์•ผํ•  ๊ฒฝ์šฐ์—๋Š” ํƒ์ƒ‰ํ•˜๊ณ ์žํ•˜๋Š” ๋ฐฐ์—ด ๋‚ด๋ถ€์— ์ค‘๋ณต๊ฐ’์ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿด๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ upper bounds ๋ฐฉ๋ฒ•๊ณผ lower bounds ๋ฐฉ๋ฒ•์„ ์ž˜ ์•Œ์•„๋‘์–ด์•ผ ๋ฌธ์ œ๋ฅผ ๋งž์ถœ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

โšซ๏ธ ๋ฌธ์ œ

https://www.acmicpc.net/problem/10816

 

10816๋ฒˆ: ์ˆซ์ž ์นด๋“œ 2

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,

www.acmicpc.net

 

โšซ๏ธ ๋‚˜์˜ ํ’€์ด

์•„ ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ํ’€๊ณ  ๋ฐœ๊ฒฌํ•œ๊ฑด๋ฐ, dictionary๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง„์งœ ๊ฐœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค .ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ dictionary์—์„œ๋Š” ๊ฐ’์— ์ ‘๊ทผํ•˜๊ณ , countํ•ด์ฃผ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ด๊ธฐ ๋•Œ๋ฌธ
contain๋ฉ”์„œ๋“œ๋Š” dictionary์—์„œ O(N)์ด๊ธด ํ•จ

 

์šฐ์„ , ๋ฐฑ์ค€์—์„œ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ๋˜์–ด์žˆ๋Š” ๋ฌธ์ œ๋‹ค. 

โ—พ๏ธ ์ฒ˜์Œ ์ƒ๊ฐํ•œ ํ’€์ด

๋‹น์—ฐํžˆ ์ฒ˜์Œ์—๋Š” ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. 

  • ์ž…๋ ฅ๋ฐ›๋Š” cards๋ฅผ sort()๋กœ ์ •๋ ฌํ•ด์ฃผ๊ณ 
  • ์ˆซ์ž m๊ฐœ๋ฅผ for๋ฌธ์„ ๋Œ๋ ค -> O(N)
  • ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ , ๋‚ด๋ถ€์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด -> O(logN)
  • filter๋กœ ์ง€๊ธˆ ๋ณด๊ณ ์žˆ๋Š” ๋ฒ”์œ„ ๋‚ด๋ถ€์—์„œ ๊ฐ™์€ ์ˆ˜ ๋ช‡๊ฐœ์ธ์ง€ ํŒ๋‹จ -> O(N)

์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทผ๋ฐ,,,, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ, ์ค‘๊ฐ„๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์† ๋ฒ”์œ„๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— filter๋กœ start ~ end ๊นŒ์ง€ ๋‚ด๋ถ€์—์„œ count๋ฅผ ํ•ด์ฃผ๋ฉด ๋†“์น˜๋Š” ์ˆ˜๊ฐ€ ๋ถ„๋ช…ํžˆ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์—ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์— ๋งŒ์•ฝ ํƒ€๊ฒŸ์ด 4๋ผ ์น˜๊ณ , start~end๊นŒ์ง€ ๋‚ด๋ถ€์—์„œ 4๋ฅผ ์ฐพ์œผ๋ฉด, 2๊ฐœ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋‹ต์€ 3์ด ์•„๋‹Œ๊ฐ€ ? ๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ filter๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ˆ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

โ—พ๏ธ ๋‘๋ฒˆ์งธ๋กœ ์ƒ๊ฐํ•œ ํ’€์ด

๋˜‘๊ฐ™์ด ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ , ์ถœ๋ ฅ๋œ ์œ„์น˜์˜ ์–‘์˜†์— ๋™์ผํ•œ ๊ฐ’์ด ๋ช‡๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

  • ์ž…๋ ฅ๋ฐ›๋Š” cards๋ฅผ sort()๋กœ ์ •๋ ฌํ•ด์ฃผ๊ณ 
  • ์ˆซ์ž m๊ฐœ๋ฅผ for๋ฌธ์„ ๋Œ๋ ค -> O(N)
  • ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ , ๋‚ด๋ถ€์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น mid๊ฐ’์ถœ๋ ฅ-> O(logN)
  • mid ์–‘์˜† ๊ธฐ์ค€์œผ๋กœ mid์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๊ณ ์žˆ๋Š”์ง€ count -> O(N)

์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋œ๋‹ค. ์กฐ๊ฑด์„ ์‚ดํŽด๋ณด๋ฉด, N์€ 50๋งŒ์ด ์ตœ๋Œ€, M๋„ 50๋งŒ์ด ์ตœ๋Œ€์ธ๋ฐ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ 2์–ตํšŒ๊ฐ€ ๋„˜๋Š” loop๋ฅผ ๋Œ์•„์•ผํ•œ๋‹ค. ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š”๊ฒŒ ๋‹น์—ฐํ•˜์ง€ ์•Š์„๊นŒ?

โ—พ๏ธ ์ธํ„ฐ๋„ท ์ฐธ๊ณ  -> upper / lower ๋ฒ”์œ„๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐ๋„ท์„ ๋ณด๋‹ˆ, ์ด๋ถ„ํƒ์ƒ‰๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€์ง€๋งŒ '๋ฒ”์œ„'๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

- lower bound: ์›ํ•˜๋Š” ๊ฐ’ k ์ด์ƒ์ด ๋‚˜์˜ค๋Š” ์œ„์น˜๋ฅผ ์ฐพ์Œ
- upper bound: ์›ํ•˜๋Š” ๊ฐ’ k ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์œ„์น˜๋ฅผ ์ฐพ์Œ

์ด๋ ‡๊ฒŒ ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜๊ณ , lower bound์˜ ์ถœ๋ ฅ๊ฐ’์€ ํƒ€๊ฒŸ๊ฐ’ ์ด์ƒ!์ด ๋‚˜์˜ค๋Š” ์œ„์น˜ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , upper bound๋Š” ํƒ€๊ฒŸ๊ฐ’ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์ˆœ๊ฐ„์˜ ์ธ๋ฑ์Šค ์œ„์น˜๋ฅผ ์ฐพ์•„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

์ด๋ ‡๊ฒŒ ๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด, ์ด๋ถ„ํƒ์ƒ‰์„ ๋‘๋ฒˆ ์‚ฌ์šฉํ•ด์„œ upper๊ฐ’๊ณผ lower๊ฐ’์„ ์ฐพ์•„๋‚ด๊ณ  (2 * log N), upper - lower ๊ฐ’์„ ํ•ด์ฃผ๋ฉด ๋‚ด๊ฐ€์›ํ•˜๋Š” ํƒ€๊ฒŸ๊ฐ’์˜ count ํšŸ์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. 

โ—พ๏ธ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค

์œ„์ฒ˜๋Ÿผ ํ’€์—ˆ๋Š”๋ฐ ํ‹€๋ ธ๋‹ค. ์™œ ํ‹€๋ ธ์„๊นŒ?
๋‚ด๊ฐ€ ๊ตฌํ•œ upper ๊ฐ’๊ณผ lower ๊ฐ’์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•ด์„œ ์ฐ์–ด๋ณด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‹น์žฅ ๋ฐฑ์ค€ ์˜ˆ์ œ์— ๋‚˜์™€์žˆ๋Š” ์‚ฌ๋ก€๋กœ ๋ณด๋ฉด,

ํƒ€๊ฒŸ๊ฐ’์ด ๋งŒ์•ฝ cards ๋‚ด๋ถ€์˜ ์ตœ๋Œ€๊ฐ’์ด๋ผ๋ฉด, cards๋‚ด๋ถ€์—์„œ ์ธ๋ฑ์Šค ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๊ฐ–๋Š”๋ฐ, ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” up - low ๊ฐ’์„ ์ถœ๋ ฅํ• ๋•Œ ์›ํ•˜๋Š” 3์ด ์•„๋‹ˆ๋ผ, 2๋ผ๋Š” ์ถœ๋ ฅ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š”, cards๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ๋งจ ๋งˆ์ง€๋ง‰ ์— ์ž„์˜๋กœ ์ œ์ผํฐ์ˆ˜ + 1ํ•ด์ค€ ๊ฐ’(์—ฌ๊ธฐ์„œ๋Š” 11)์„ cards์— ์ถ”๊ฐ€๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

์•„ ์ž ๊น, ๊ทธ๋Ÿผ ๋˜ target๊ฐ’์ด 11์ด ๋œ๋‹ค๋ฉด ๋‹ต์€0์ธ๋ฐ 1์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜์ง€ ์•Š๋ƒ๊ตฌ? 
์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์งœ๋†“์€ ๊ตฌ์กฐ๋กœ ๋ณด๋ฉด, ์ด์ƒ์ผ ๊ฒฝ์šฐ์— low๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ , ์ดˆ๊ณผ๊ฐ€ ๋‚ ๊ฒฝ์šฐ up์„ ์„ค์ •ํ•ด์ฃผ์ง€๋งŒ ์œ„์—์„œ ๋ณด๋‹ค์‹œํ”ผ up๊ฐ’์ด ์ตœ๋Œ€๊ฐ’์ด๋ผ๋ฉด, ๊ทธ๋ƒฅ cards์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

ํ˜„์žฌ ์ž„์˜๋กœ ๋„ฃ์–ด์ค€ 11๋กœ ๋ณด๋ฉด, up๊ณผ low๋Š” ๊ฒฐ๊ตญ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ •๋‹ต์€ ๊ฒฐ๊ตญ 0์ด ์ถœ๋ ฅ๋˜๊ฒŒ ๋œ๋‹ค! 

 

โšซ๏ธ ์ •๋‹ต ์ฝ”๋“œ

import Foundation

let n = Int(readLine()!)!
var cards = readLine()!.split(separator: " ").map{ Int($0)! }.sorted(by: <)
cards.append(cards[cards.count - 1] + 1)
let m = Int(readLine()!)!
let nums = readLine()!.split(separator: " ").map{ Int($0)! }

func lowerBound(arr: [Int], start: Int, end: Int, target: Int) -> Int {
    var start = start
    var end = end

    while end > start {
        let mid = start + ((end - start) / 2)

        if arr[mid] >= target {
            end = mid
        } else {
            start = mid + 1
        }
    }

    return start
}

func upperBound(arr: [Int], start: Int, end: Int, target: Int) -> Int {
    var start = start
    var end = end

    while end > start {
        let mid = start + ((end - start) / 2)

        if arr[mid] > target {
            end = mid
        } else {
            start = mid + 1
        }
    }

    return end
}

for i in 0..<m {
    let target = nums[i]
    let up = upperBound(arr: cards, start: 0, end: n, target: target)
    let low = lowerBound(arr: cards, start: 0, end: n, target: target)
    print("\(up - low)", terminator: " ")
}
๋ฐ˜์‘ํ˜•