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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 2110๋ฒˆ - ๊ณต์œ ๊ธฐ ์„ค์น˜ (๊ณจ๋“œ4, ์ด๋ถ„ํƒ์ƒ‰)

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

โšซ๏ธ ๋ฌธ์ œ 

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

 

2110๋ฒˆ: ๊ณต์œ ๊ธฐ ์„ค์น˜

์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์œ ๊ธฐ์˜ ๊ฐœ์ˆ˜ C (2 ≤ C ≤ N)์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ง‘์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ€

www.acmicpc.net

 

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

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

์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ๋‘๊ณ  ํƒ์ƒ‰ํ• ๊ฒƒ์ธ๊ฐ€๊ฐ€ ๊ณ ๋ฏผ์Šค๋Ÿฌ์› ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ์ฒ˜์Œ์— ๋ฌด์ž‘์ • ์ƒ๊ฐํ•œ ํ’€์ด ๋ฐฉ์‹์€, C๊ฐœ์˜ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•˜๋‹ˆ, N๊ฐœ์˜ ์ง‘์—์„œ C๊ฐœ์˜ ์ง‘์„ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ณ ๋ คํ•œ ๋’ค ๊ฑฐ๋ฆฌ๋ฅผ ๋ณผ๋ผ? ์‹ถ์—ˆ๋Š”๋ฐ ใ…‹ใ…‹ใ…‹ใ…‹ ๋ง๋„ ์•ˆ๋๋‹ค. ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋ณด์ž

์ž…๋ ฅ ์กฐ๊ฑด์€ ์ด๋ ‡๋‹ค. ์ผ๋‹จ ์ง‘์€ ์ตœ๋Œ€ 10์–ต๊ฐœ๊ฐ€ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š”๊ฒŒ ๋‹น์—ฐํ•ด๋ณด์˜€๋‹ค.

โ—พ๏ธ ๊ทธ๋Ÿผ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ณ  ํƒ์ƒ‰ํ•ด์•ผํ•˜์ง€? 

๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•˜๊ณ , ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๋Š”๋ฐ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ณ  ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š”์ง€ ์˜ค๋žซ๋™์•ˆ ํ—ค๋งธ๋‹ค. ์ธํ„ฐ๋„ท์˜ ์กฐ๊ธˆ์˜ ๋„์›€์„ ์–ป์€ ๊ฒฐ๊ณผ, '๊ฑฐ๋ฆฌ'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด ๋๋‹ค. 

5 3
1
2
8
4
9

๋ฐฑ์ค€์—์„œ ์ฃผ์–ด์ง„ ์˜ˆ์ œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ดํŽด๋ณด์ž. ์šฐ์„ , ์ง‘๋“ค์€ ์ผ์ง์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด์„œ ๊ฐ ์ง‘๋งˆ๋‹ค ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋Š” 1์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ฃผ์–ด์ง„ ์˜ˆ์ œ์—์„œ๋Š” ์ตœ๊ณ  ๊ฑฐ๋ฆฌ๋Š” ์ฒซ๋ฒˆ์งธ์ง‘๊ณผ ๋งˆ์ง€๋ง‰์ง‘์˜ ๊ฑฐ๋ฆฌ์ธ 8์ด ๋  ๊ฒƒ์ด๋‹ค. 

โ—พ๏ธ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์žฌ๋กœ ๋“  ์ƒ๊ฐ์€, ์„ ํ˜•ํƒ์ƒ‰์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š”๊ฒƒ 

๊ฑฐ๋ฆฌ๊ฐ€ 1์ผ ๋•Œ, 2์ผ๋•Œ, 3์ผ ๋•Œ,,,, ์ด๋ ‡๊ฒŒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด์„œ ์ด C๊ฐœ์˜ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด? ์ •๋‹ต์œผ๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

์ด๋ ‡๊ฒŒ ํ’€์–ด๋„ ๋ฌธ์ œ๋Š” ํ’€๋ฆด๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ์—๊ฒ ์ž…๋ ฅ ์กฐ๊ฑด์ด ์ฃผ์–ด์กŒ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด, O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ ํ…๋ฐ, ์šฐ๋ฆฌ๋Š” ์ด N์„ 10์–ต๊นŒ์ง€ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,, ์ด๋ ‡๊ฒŒ ์„ ํ˜•ํƒ์ƒ‰์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

โ—พ๏ธ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ’€์–ด์•ผํ•œ๋‹ค

์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์ด๋ถ„ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ left, right, mid๋ฅผ ์„ค์ •ํ• ๊นŒ? ์•ž์—์„œ ๋งํ–ˆ๋“ฏ, ์ด๊ฒƒ์„ ๊ณ ๋ฏผํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์˜ค๋žœ์‹œ๊ฐ„์„ ํ• ์• ํ–ˆ๊ณ , ๊ฒฐ๊ตญ,, ์ธํ„ฐ๋„ท์˜ ๋„์›€์„ ์กฐ๊ธˆ ๋ฐ›์•˜๋‹ค. (๋˜ ๋ง‰์ƒ ๋„์›€๋ฐ›์œผ๋‹ˆ๊นŒ ์™ค์ผ€ ์‰ฝ๋ƒ.. ๋‚ด ์ƒ๊ฐ์€ ์™ค์ผ€ ์งง์€๊ฒƒ์ธ๊ฐ€? ใ…œใ…œ)

์•ž์—์„œ ๋งํ–ˆ๋“ฏ, left๋Š” ํ•ด๋‹น ์ง‘๋“ค ์‚ฌ์ด์˜ ๊ฐ€์žฅ ์ตœ๋‹จ๊ฑฐ๋ฆฌ 1, right๋Š” ํ˜„์žฌ ์ž…๋ ฅ๋ฐ›์€ ์ง‘๋“ค ์‚ฌ์ด์—์„œ ์ตœ๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • ์ด๋ถ„ํƒ์ƒ‰์€ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰ -> home ๋ฆฌ์ŠคํŠธ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•ด์ฃผ์–ด์•ผ ํ•จ
  • left ์™€ right์„ค์ •
  • mid๋Š” ( left + right ) / 2 ๋กœ ์„ค์ •ํ•œ ๋’ค
  • home ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž ๋ถ€ํ„ฐ mid ๊ฐ„๊ฒฉ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๊ณต์œ ๊ธฐ ์„ค์น˜, ์„ค์น˜๋œ home ๊ฐฏ์ˆ˜ cnt
    (mid ๊ฐ„๊ฒฉ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์„ค์น˜ํ•˜๋Š” ์ด์œ ๋Š”, ์ตœ์†Œ! mid๋งŒํผ ๋–จ์–ด์ ธ์žˆ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ)
  • ์„ค์น˜๋œ ๊ณต์œ ๊ธฐ ๊ฐฏ์ˆ˜๊ฐ€ c๋ณด๋‹ค ์ž‘๋‹ค๋ฉด, mid ๊ฐ€ ๋„ˆ๋ฌด ๋„“๋‹ค๋Š” ๋œป -> mid๋ฅผ ์ค„์—ฌ์ฃผ์–ด์•ผํ•จ (right๋ฅผ left์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ mid๊ฐ€ ์ค„์–ด๋“ฌ)
  • ์„ค์น˜๋œ ๊ณต์œ ๊ธฐ ๊ฐฏ์ˆ˜๊ฐ€ c๋ณด๋‹ค ํฌ๋‹ค๋ฉด, mid๊ฐ€ ๋„ˆ๋ฌด ์ข๋‹ค๋Š” ๋œป -> mid๋ฅผ ๋„“ํ˜€์ฃผ์–ด์•ผํ•จ (left๋ฅผ right์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ mid๊ฐ€ ์ปค์ง)

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰์‹œ์ผœ์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค. ์ด๋ถ„ํƒ์ƒ‰ ํŠน์„ฑ์ƒ, '์œ„์น˜'๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŽ์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ mid๋ฅผ ๋„“ํžŒ๋‹ค, ์ค„์ธ๋‹ค์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์• ๋งคํ–ˆ๊ณ  ์ƒ๊ฐํ•ด๋‚ด๊ธฐ ์กฐ๊ธˆ ํž˜๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 

 

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

import Foundation

let nc = readLine()!.split(separator: " ").map{ Int($0)! }
let n = nc[0]
let c = nc[1]
var home = [Int]()

for _ in 0..<n {
    home.append(Int(readLine()!)!)
}
home.sort()

var left = 1
var right = home[home.count - 1] - home[0]
var answer = -999

while left <= right {
    var start = home[0]
    var cnt = 1
    let mid = (left + right) / 2

    // mid ๊ธฐ์ค€์œผ๋กœ home ๋ฆฌ์ŠคํŠธ ๋Œ๋ฉด์„œ ๊ณต์œ ๊ธฐ ์„ค์น˜ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
    for i in 0..<n {
        let d = home[i] - start
        // mid๋ณด๋‹ค ์ปค์•ผ ๊ณต์œ ๊ธฐ ์„ค์น˜ ๊ฐ€๋Šฅ
        if mid <= d {
            cnt += 1
            start = home[i]
        }
    }

    // ๋ฒ”์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์—ฌ๋‚˜๊ฐ€๋Š”๊ฑฐ์•ผ?
    // let mid = (left + right) / 2
    // ๊ณต์œ ๊ธฐ๊ฐ€ ๋„˜ ๋งŽ์œผ๋ฉด -> mid๋ฅผ ๋„“ํ˜€์•ผํ•ด mid๋ฅผ ๋„“ํž๋ผ๋ฉด? left๋ฅผ right์ชฝ์œผ๋กœ ๊ฐ€์•ผ mid๊ฐ€ ์ปค์ง
    // ๊ณต์œ ๊ธฐ๊ฐ€ ๋„˜ ์ ์œผ๋ฉด -> mid๋ฅผ ์ค„์—ฌ์•ผํ•ด mid๋ฅผ ์ค„์ผ๋ผ๋ฉด? right๋ฅผ left์ชฝ์œผ๋กœ ๊ฐ€์ค˜์•ผ mid๊ฐ€ ์ž‘์•„์ง
    if c <= cnt {
        answer = mid
        left = mid + 1
    } else {
        right = mid - 1
    }
}

print(answer)

 

๋ฐ˜์‘ํ˜•