[๋ฐฑ์ค] Swift 1300 k๋ฒ์งธ ์ BS(Bineary Search)
๋ฌธ์ :
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
ํ์ด :
๋ฌธ์ ๋ฅผ ์ง์ ํ์ง ๋ชปํ์ง๋ง, ์ ๊ธฐํ ํ์ด๊ฐ ์์ด์ ๊ธฐ๋ก์ ๋จ๊ฒจ๋ณด๋ ค๊ตฌ ํ๋ค.
๋ฌธ์ ๋ 2์ฐจ์ N*N ๋ฐฐ์ด ๊ฐ์ 1์ฐจ์ N*N๋ฐฐ์ด๋ก ๋ฐ๊พธ์์๋ k๋ฒ์งธ ์ธ๋ฑ์ค์ ๊ฐ(m)์ ๊ตฌํ๋ ๋ฌธ์ ์๋ค.
์๋ฅผ ๋ค์ด์ N = 4 ๋ฐฐ์ด์ด ์์๋,
์ด๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋์ฌ๋ณด๋ฉด
์ด๋ ๊ฒ ๋ ๊ฒ์ด๊ณ ๊ทธ๋ฌ๋ฏ๋ก ์ด๋ฅผ ์ด๋ถ ํ์์ผ๋ก ์ ๊ทผ ํ ์ ์๋ ๊ฒ์ด๋ค.
์ฌ์ค ์ ํ ํ์์ผ๋ก ์ฐพ์ผ๋ ค ํ์ง๋ง N(100,000) X N(100,000) ์ ๋ฐฑ์ต์ด๋ฏ๋ก ์๊ฐ์ด๊ณผ๊ฐ ๋๊ฒ ๋๋ค. ๊ทธ๋์ ์ด๋ถํ์์ผ๋ก ํ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด k๊ฐ 6์ด๊ณ k๋ฒ์งธ ์ 4(m = 4)๋ผ๊ณ ํ์๋ 4๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์๋ค์ ๊ฐ์๊ฐ ๊ณง ์ธ๋ฑ์ค๊ฐ ๋๋ค. ๋ฐ๋ผ์ k๋ณด๋ค ์๋ค๋ฉด left๊ฐ์ ์ฆ๊ฐ์์ผ ๋ฒ์๊ฐ ํฐ ์ชฝ์์ ๊ฒ์ฌํด์ผ ํ๋ค. ๋ฐ๋๋ก ๊ฐ์๊ฐ k๋ณด๋ค ํฌ๋ค๋ฉด right๊ฐ์ ๊ฐ์์์ผ ์์ ๋ฒ์์ชฝ์์ ๊ฒ์ฌํด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด m๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ ์ด๋ป๊ฒ ๊ตฌํ ์ ์์๊น ?
https://www.acmicpc.net/board/view/14272
์ด ๊ธ์ ์ฐธ๊ณ ํ๋ค.
m๋ณด๋ค ์์ ๊ฐ์ m ๊ฐ์ i๋ก ๋๋ ๊ฐ๊ณผ n์ค ์์ ๊ฐ์ ์ฑํํ์ฌ ๋ค ๋ํ๊ฒ ๋๋ฉด n๋ณด๋ค ์์ ๊ฐ์ ์ฐพ์ ์ ์๋ค (์ ๊ธฐ ..!)
๋ฐ๋ผ์ ์ด ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ด๋ถํ์์ ์งํํ์ฌ ํธ๋ ๊ฒ์ด๋ค.
swift ์ฝ๋ :
//
// main.swift
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2022/03/31.
//
import Foundation
var n = Int(readLine()!)!
var k = Int(readLine()!)!
func binearySearch(_ left: Int, _ right: Int) -> Int {
if(left > right) { return left }
var mid = (left + right) / 2
var cnt = 0
for i in 1..<n+1 {
if(n > mid / i) { // mid ๋ณด๋ค ์์ ์ ๋ํด์ค
cnt += mid / i
}else {
cnt += n
}
}
if(cnt < k) {
return binearySearch(mid+1, right)
}else {
return binearySearch(left, mid - 1)
}
}
print(binearySearch(1, k))