โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/2110
โซ๏ธ ๋์ ํ์ด
โพ๏ธ ์ฒ์์ ์๊ฐํ ํ์ด
์ด๋ค ๊ฒ์ ๊ธฐ์ค์ผ๋ก๋๊ณ ํ์ํ ๊ฒ์ธ๊ฐ๊ฐ ๊ณ ๋ฏผ์ค๋ฌ์ ๋ ๋ฌธ์ ์๋ค. ์ฒ์์ ๋ฌด์์ ์๊ฐํ ํ์ด ๋ฐฉ์์, 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)