๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] Swift 1300 k๋ฒˆ์งธ ์ˆ˜ BS(Bineary Search)

by Jouureee 2022. 3. 31.

๋ฌธ์ œ :

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))

๋Œ“๊ธ€