๋ฌด๋ ค ๊ณจ๋2๋ผ์ ์์ฒญ ๊ฒ๋จน์๋ ๋ฌธ์ ...
์์ฒญ ์ด๋ ค์ ๋ค๊ธฐ๋ณด๋ค๋, ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ๊ทธ๊ฒ์ ํด์ํ๋ ๊ณผ์ ๊น์ง๊ฐ ์ด๋ ค์ ๋ค. ๋๊ฒ๋ง ์๊ฐํ๋ฉด ๋ฐ๋ก ํ๋ฆฌ๋ ๋ฌธ์ ?
ํ์ง๋ง, ์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๊ถ๊ธํ์ ์ด ์๊ฒผ๋ค. ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ค ์ฐ์ด๋ด๋ ๋ชจ๋ฅด๊ฒ ์ง?
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/1300
1300๋ฒ: K๋ฒ์งธ ์
์ธ์ค์ด๋ ํฌ๊ธฐ๊ฐ N×N์ธ ๋ฐฐ์ด A๋ฅผ ๋ง๋ค์๋ค. ๋ฐฐ์ด์ ๋ค์ด์๋ ์ A[i][j] = i×j ์ด๋ค. ์ด ์๋ฅผ ์ผ์ฐจ์ ๋ฐฐ์ด B์ ๋ฃ์ผ๋ฉด B์ ํฌ๊ธฐ๋ N×N์ด ๋๋ค. B๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ ๋, B[k]๋ฅผ ๊ตฌํด๋ณด์. ๋ฐฐ์ด A์ B
www.acmicpc.net
โซ๏ธ ๋์ ํ์ด
์ฒ์์ ๋ณด์๋ง์ ์ฅ ์ด๊ฒ ์ ๊ณจ๋? ์ถ์๋ค. ๊ทธ๋ฌ๋ ์๊ฐ ์กฐ๊ฑด์ ๋ดค๋๋ฐ ์ต์ ์ ๊ฒฝ์ฐ๊ฐ 100์ตใ ์ด ๋์ค๋๊ฒ ์๋๊ฐ!! ๊ทธ๋ ๋ค๋ฉด... O(N^2) ์ํ์ผ๋ก๋ ํ์ ์๋ค๋ ๋ป์ธ๋ฐ!!
์ฒ์ ์๊ฐํ ํ์ด๋, i*j๋ฅผ ๋ชจ๋ ๊ณ์ฐํ list๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ ๊ฒ ใ ใ ใ ใ ใ ใ ใ ใ
๊ทธ๋ ๋ค๋ฉด, ๋ฐฐ์ด B์ ์ต๋ ๊ธธ์ด๊ฐ 100์ต์ด ๋์จ๋ค. ๋ชจ๋ ๊ตฌํด์ ๋ฐฐ์ด B๋ฅผ ๋ง๋๋๊ฒ์... ๋ฌด์กฐ๊ฑด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋ ๋ค๋ฉด? ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ ์ด๋ถํ์์ ์ด์ฉํด์ B[K]๋ฅผ ์ฐพ์์ฃผ์ด์ผ ํ๋ค๋ ๋ง์ด๋ค! ๋๋์ฒด ๋ฌด์จ ์ด๋ป๊ฒ ์ด๊ฑธ ์ด์บ? ์ด์บ ์ด์บ์ด์ผ๊ตฌํจ?????
๋์ ํ ๊ฐ์ด ์ค์ง ์์๋ค. ... ๊ทธ๋ ๊ฒ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ฆฌ๋ค๊ฐ ์๊ฐํด๋ธ๊ฑด...
์ฐพ์๋ธ ๊ท์น์ค ํ๋๋,,, ์ด๋ ๊ฒ ์ ๋ ฅ๋ 2์ฐจ์ ๋ฐฐ์ด A์ ๊ฐ๋ค์ i*j๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก, ๋นจ๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ด ๋์ผํ๊ฒ ๋์จ๋ค๋ ๊ฒ์ด๋ค... ์ด๊ฒ์ ์ข ์ด์ฉํด์ ํ์ํ๋ ๋ฒ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ด๋ฉด ์๋๋ ค๋?? ์ถ์์ผ๋.... ์ ๋ฐ์ผ๋ก ํ์๋ฒ์๋ฅผ ์ค์ฌ๋ 50์ต์ด๋ค.ใ ใ ใ ใ ใ ใ ์ด๊ฒ๋ ์งค!
ใ ์ผ์์์์์ ๊ทธ๋ผ ์ด์ผํ๋ค๋๊ฑฐ์ผ ์ด์ผํ๋ค๋๊ฑฐ์ผ ๋์ด๋ ค์ .... ๊ทธ๋ฌ๋ ์์ค ์ด๋ถํ์์ ๋์์ ๋จผ์ ์ฐพ์๋ด์ผ๊ฒ ๋ค๊ณ ์๊ฐ์ ์ ๋ฆฌํ๋ค. ๊ทธ๋ ๊ฒ ํ๊ณ left์ right๋ฅผ ์ค์ ํด๋ณด๊ณ , mid๋ฅผ ์ค์ ํด๋ณด์๋ค. ๋ฐ๋ก ์ด์ ํฌ์คํ ์์ (programmers ์ง๊ฒ๋ค๋ฆฌ) mid์ ์๋ฏธ๋ฅผ ๊ธฐ์ตํ๋ฉฐ ๋์์ ์ฐพ์๊ณ ๋ค์งํ๋ค. ๊ทธ๋ ๊ฒ ์๊ฐํด๋ธ๊ฒ ๋ฐ๋ก ์ด๊ฒ!
์ฐ์ , ๊ฒฐ๊ณผ๊ฐ์ธ ์ซ์๊ฐ ๋์ค๊ธฐ ์ํด์๋, ์ต์๊ฐ์ 1 ์ผ๊ฒ์ด๊ณ , ์ต๋๊ฐ์ ์ฃผ์ด์ง N์ ์ ๊ณฑ์ธ 9์ผ ๊ฒ์ด๋ค. (๋ฐฑ์ค ์์ 1 ๊ธฐ์ค) ์๋๋ฉด??? ์ฐ๋ฆฌ๋ B๋ฐฐ์ด ๋ด๋ถ์ i*j์ ๊ฐ๋ง ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋๋ก N*N์ด๋ผ๋ ์๊ฐ ๋ค์ด๊ฐ๋ค. ๊ทธ๋์ left๋ฅผ1 right๋ฅผ 9๋ก ์ค์ ํด์ฃผ๊ฒ ๋๋ค๋ฉด, mid๊ฐ 5๊ฐ ๋์จ๋ค. ๋ฌธ์ ์ ์ถ๋ ฅ ์กฐ๊ฑด์ด '์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์๋ B[k]'๋ฅผ ๊ตฌํ๋ผ๋ ๊ฒ์ด๋ค. ์ฆ, K๋ฒ์งธ์ ์๊ฐ ๋ญ๋? ๋ผ๋ ๋ป์ธ๋ฐ, ์ฌ๊ธฐ์ ์ด K๋ฒ์จฐ์ ์๋ ์๊ฐ mid๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
(์ฌ๊ธฐ ์๊ฐํด๋ด๋๊ฒ ์ข ์ด๋ ค์ ์ ใ ใ ) ๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ ๋ค๋ฉด! k๋ฒ์งธ์๊ฐ 5์ด๊ธฐ ์ํด์๋, 5์์ 5๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์๊ฐ K-1๊ฐ ์์ด์ผํ๋ค. ๋ง์ฝ 5์์ K-1๋ณด๋ค ๋ง์ ์๊ฐ ์๋ค๋ฉด, ํ์ฌ 5๋ K๋ฒ์งธ๋ณด๋ค ํจ์ฌ ๋ค์ ์๋ ์๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ์์ ๋ฒ์๋ฅผ ์ค์ฌ์ค์ผํ๋ค. ๊ทธ๋ผ right๋ฅผ mid - 1๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๊ฒ ์ง? ๋ฐ๋๋ก ๋ง์ฝ 5์์ k-1๋งํผ์ ์ ํน์ ๊ทธ๊ฑฐ๋ณด๋ค ์์์๋งํผ ์๋ฐ๋ฉด? K๋ฒ์งธ๋ณด๋ค ์์ ์๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์, ์์ ๋ฒ์๋ฅผ ๋๋ ค์ฃผ์ด์ผํ๋ค. ๊ทธ๋ผ left = mid + 1๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค!
โ ๏ธ ์๋ ์ฌ๊ธฐ์, ๋ฒ์๋ฅผ ์ด์ผ ์ก๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์์ ๋ฏธ์น ์ง๊ฒฝ์ด๋ค.
์ฒ์์ ์์ฑํ ๋ฒ์๋ ์ด๋ฌ๋ค. ๊ทผ๋ฐ ๋ต์ด 6์ด ์๋๋ผ 5๊ฐ ๋์ค๋๊ฒ ์๋๊ฐ!!
// (1)๋ฒ โ ํ๋ฆฐ ์ฝ๋
if minCount > k {
right = mid - 1
} else {
answer = mid
left = mid + 1
}
๊ทผ๋ฐ ๋ ์๋์ฒ๋ผ ์์ฑํ๋ฉด ์ ๋ต์ฒ๋ฆฌ๊ฐ ๋๋ค.
// (2)๋ฒ โ
์ ๋ต์ฝ๋
if minCount < k {
left = mid + 1
} else {
answer = mid
right = mid - 1
}
์ง์ง ๋๋์ฒด ์ minCount >= k ์ผ๋ anwer=mid๋ฅผ ์ค์ ํด์ฃผ์ด์ผํ๋๊ฑฐ์ง? ์ถ์๋ค. ์ง์ง ๋์ ํ ์ดํด๊ฐ ๊ฐ์ง ์์๋๋ฐ,,,, ์ด์ ... ์ดํด๊ฐ ๋์ด์ ์ค๋ช ํด๋ณด๋ ค๊ณ ํ๋ค. (๋ชจ๋ ๋ธ๋ก๊ทธ๊ฐ ์ค๋ช ํด์ฃผ์ง ์์์ ๋ฝ๋ก์ผ๋ก ๊ฑ ๋ง์ถ๋๊ฑด๊ฐ ์ถ์์ ;;)
์ ์์ 1์์ ๋์ฌ ์ ์๋ ๋ฐฐ์ด B๋ฅผ ๋ณด์.
์ด๋ ๊ฒ, ๋ชจ๋ ์๊ฐ ๋ค๋ฅด์ง ์๊ณ ์ค๋ณต๋๋ ์๋ ์๊ธด๋ค. ์ฐ๋ฆฌ๋ ๋ ธ๋์ ์ธ๋ฑ์ค 7๋ฒ์ ์๋ 6์ ์ฐพ์๋ด๊ณ ์ถ์๊ฒ์ด๋ค. ๊ทธ๋ผ ์ฌ๊ธฐ์ ์ด์ผ ๋น๊ตํด์ mid๊ฐ 6์ด ๋์๋์ง ์๊ฐํด๋ณด์.
ํ์ฌ ์ด ์ํฉ์์ ๋ ธ๋์ ๋ถ๋ถ 6์ด K = 7๋ฒ ์งธ ์ ๋ต์ด๋ค. ํ์ง๋ง, ์ด๋ถํ์์ ํน์ง์ ์ ๊ธฐ์ตํด๋ณด๋ฉด ์ด๋ถํ์์ '์ ํํ!!!!'์ ๋ต์ ์ฐพ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค. (๋ญ,,, ๊ทธ๋ผ ์ ๋ง์ถ ์ ์๋๋ก ๋ฌธ์ ๊ฐ ์ถ์ ๋๊ฒ ์ง?) ์ด์จ๋ , ์์ if ๋ฌธ์ ๋ณด๋ฉด, minCount๊ฐ 7๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด answer = mid๋ฅผ ์ํํ๋ค. minCount๋ ์ง๊ธ mid์ธ ์ '6'๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ ๊ฐฏ์๋ฅผ countํ๋ค. ๊ทธ๋ผ?? K=8 ์์น์ ์๋ ๊ฐ๋ 6์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด count ๊ฐ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ผ ์ง๊ธ ํ์ฌ minCount๋ 8์ผ ๊ฒ์ด๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ ์กฐ๊ฑด์ด (1)๋ฒ โ ํ๋ฆฐ์ฝ๋ ๋ฒ์์ฒ๋ผ ์ค์ ์ด ๋์ด์๋ฐ๋ฉด, 8>7 ์ด๊ธฐ ๋๋ฌธ์ answer ์ 6์ด ์ ์ฅ๋์ง ์๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ minCount >= k ์ธ (2)๋ฒ โ ์ ๋ต์ฝ๋ ๋ฒ์๋ก ์ค์ ํด์ฃผ์ด์ผํ๋ค!! !
์ด๋ ๊ฒ ์ด๋ถํ์์์๋ ์์ ๋ฅผ ์ ๋ณด๊ณ ๋ชจ๋ ๊ฒฝ์ฐ์์๋ฅผ ํ๋จํ์ฌ ๋ฒ์๋ฅผ ์ค์ ํ๊ณ , mid๊ฐ์ ์ฃผ๋ ๋ฒ์๋ฅผ ์ด๋ป๊ฒ ์ฃผ์ด์ผํ๋์ง ๊น์ง๋ ์ ๊ณ ๋ฏผ์ด ๋์ด์ผ ๋ง์ถ์ ์๋ค. ๐ค๐ค๐ค๐ค ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ถํ์ ๋ฌธ์ ๋ ์์ง ๋์๊ฒ ๋๋ ์ด๋ ต๊ฒ ๋๊ปด์ง๋ค!
๐ค ๊ทธ๋ฆฌ๊ณ ๋ ์ฌ๊ธฐ์, mid๋ณด๋ค ์์ ์๋ค์ ๊ฐ์๋ ์ด์ผ ๊ตฌํ๋๊ณ ?
์ด๊ฒ์... ๋๋ ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ธํฐ๋ท์ ์ฐธ๊ณ ํ๋ค ใ ใ ๋์ ํ for ๋ฌธ์ผ๋ก ์ํ ๋๋ฆฌ๋๊ฒ ๋ง๊ณ ๋ ์๊ฐ์ด ์๋ฌ๋ค.... ๊ทผ๋ฐ ์ญ์๋,, ์ํ์ ์ผ๋ก ์ ๊ทผํ๋ ๋ ธ๋ จํจ์ด ํ์ํ๋ค.
for i in 1..<n+1 {
minCount += min(mid / i, n)
}
์ด๊ฒ ๋ฌด์จ ์๋ฏธ๋??!?!? ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด์... (์ ์ด๋ฐ ์ํ์ ์ธ ์ ๊ทผ ์ด์ผ ... ๊ตฌํ๋๊ฑฐ์ผ ใ ใ ์ง์ง ๋ฌธ์ ๋ง์ด ํ์ด๋ณด๋๊ฒ ๋ต์ด๋ค.. )
์์ฐ ... ๊ทธ๋ฅ ๊ฐ๋จํ๊ฒ i*j ๋ฅผ for๋ฌธ์ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ, ๊ฐ๋จํ ์ํ์์ผ๋ก ๊ตฌํ ์ ์์๋ค. ๊ทธ๋ฆฌ๊ณ , ๋ช ํํ ์ฒ๋ฆด๋ฅด ์ํด min ์ฒ๋ฆฌ๊น์ง ํด์ฃผ๋ ์ ... ๋๋จํจ...! ์ด๋ ๊ฒ i*j์ค ํ์ฌ mid๋ณด๋ค ์์์๊ฐ ๋ช๊ฐ ์ง ๊ตฌํ ์ ์๋ฐ. ์ฝ๋๋ก ์์ฑํ๋ฉด ํ๋งํผ๋ง ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ 10๋ง๋ฒ ๋์๊ฐ ๊ฒ์ด๊ณ , O(100000)์ด ๋ ๊ฒ์ด๋ค.
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
let n = Int(readLine()!)!
let k = Int(readLine()!)!
private func solution() {
var left = 0
var right = k
var answer = 0
while left <= right {
let mid = (left + right) / 2
var minCount = 0
for i in 1..<n+1 {
minCount += min(mid / i, n)
}
if minCount < k {
left = mid + 1
} else {
answer = mid
right = mid - 1
}
}
print(answer)
}
solution()