๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
5๏ธโƒฃ CS/Algorithm

[Swift Algorithm Note] ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด 2 (feat. BS)

by seolhee2750 2021. 8. 29.

์ €๋ฒˆ์—๋Š” DP๋กœ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS)๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ,

์˜ค๋Š˜์€ DP๋ณด๋‹ค ํ›จ์”ฌ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ข‹์€ ์ด๋ถ„ ํƒ์ƒ‰ (BS)๋กœ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์ ๋„ ์•Œ์•„๋ณด๊ณ , ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ LIS๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

(LIS์— ๋Œ€ํ•œ ์„ค๋ช…, ๊ทธ๋ฆฌ๊ณ  DP๋กœ LIS ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ถ๊ธˆํ•˜์‹ ๋ถ„๋“ค์€ ์š”๊ธฐ๐Ÿ‘‡๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

2021.08.28 - [๐Ÿ“ Algorithm Note/๐Ÿ” with Swift] - [Swift Algorithm Note] ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (feat. DP)

 

[Swift Algorithm Note] ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (feat. DP)

์˜ค๋Š˜์€ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ คํ•œ๋‹ค. LIS๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€์ง€๋งŒ, ๊ทธ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๊ฐ„ํŽธํ•œ DP๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค. (DP์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ์š”๊ธฐ๐Ÿ‘‡๋ฅผ ์ฐธ๊ณ 

seolhee2750.tistory.com

 

๐Ÿ“Ž ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ•˜๋Š” LIS

LIS๋ฅผ DP๊ฐ€ ์•„๋‹Œ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ–ˆ์„ ๋•Œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ ,

์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

 

๐Ÿ“Œ DP์™€์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ์ฐจ์ด

์•ž์„œ DP๋กœ LIS๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ,

DP๋Š” ์ˆ˜์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋งˆ๋‹ค ์ด์ „ ์ˆ˜๋“ค์„ ๋น„๊ตํ•ด์ฃผ์–ด์•ผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^2)์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ N์ด ์•„์ฃผ ์ปค์ง„๋‹ค๋ฉด ๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค,,

์ž…๋ ฅ์ด 100๋งŒ๊ฐœ ์ •๋„๋งŒ ๋˜๋”๋ผ๋„ ์‹คํ–‰ ์‹œ๊ฐ„์ด 10์ดˆ ์ด์ƒ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ถ„ ํƒ์ƒ‰์€ O(log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ,

BS๋ฅผ ์ด์šฉํ•ด ๊ตฌํ•ด์ค€๋‹ค๋ฉด LIS๋ฅผ ๊ตฌํ•˜๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(nlog n)์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด๋ถ„ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ LIS๋ฅผ ๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋ฅผ ์˜ˆ์ œ๋กœ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

import Foundation

let permu = [1, 3, 2, 5, 4, 6]
var lis = [Int]()

func BinarySearch(_ start: Int, _ end: Int, _ value: Int) -> Int {
    var s = start // lis์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค
    var e = end // lis์˜ ๋งจ ๋ ์ธ๋ฑ์Šค
    var m = 0 // s์™€ m์˜ ์ค‘๊ฐ„ ์ธ๋ฑ์Šค
    
    while s < e {
        m = (s + e) / 2
        if value <= lis[m] { e = m }
        else { s = m + 1 }
    }
    
    return s
}

for i in 0..<permu.count {
    if lis.isEmpty { lis.append(permu[i]) }
    else if lis.last! < permu[i] { lis.append(permu[i]) }
    else { lis[BinarySearch(0, lis.count-1, permu[i])] = permu[i] }
}

print(lis.count)

๋ณ€์ˆ˜ ์„ค๋ช…

  • permu : ์ฃผ์–ด์ง„ ์ˆ˜์—ด
  • lis : ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด

์ฝ”๋“œ ์„ค๋ช…

  • ์•„๋ž˜์ชฝ์˜ for๋ฌธ์„ ๋ณด๋ฉด, ์ˆœ์„œ๋Œ€๋กœ permu[i]๋ฅผ ๋„ฃ์„ lis์˜ ์ ์ ˆํ•œ ์ž๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
    if, lis ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ lis์˜ ๋งˆ์ง€๋ง‰์— permu[i]๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
    else if, lis์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ permu[i]๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ lis ๋งˆ์ง€๋ง‰์— permu[i]๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
    else, lis ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์ง€๋„ ์•Š๊ณ  lis ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ permu[i]๋ณด๋‹ค ํด ๊ฒฝ์šฐ
    BinarySearch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ , lis์˜ ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜ ์š”์†Œ๋ฅผ permu[i]๋กœ ๊ฐฑ์‹ ํ–ˆ๋‹ค.
  • BinarySearch ํ•จ์ˆ˜๋Š” start, end, value๋ฅผ ์ธ์ž๋กœ ํ•„์š”๋กœ ํ•˜๋Š”๋ฐ,
    ๊ฐ๊ฐ lis์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค, ๋ ์ธ๋ฑ์Šค, ๊ทธ๋ฆฌ๊ณ  permu[i] ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.
  •  start์™€ end๋Š” ๊ฐ๊ฐ s์™€ e ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ , m์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    m ๋ณ€์ˆ˜๋Š” ์ด๋ถ„ํƒ์ƒ‰์„ ํ•˜๋ฉฐ ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋  s์™€ e์˜ ์ค‘๊ฐ„ ๊ฐ’์„ ์ €์žฅํ•  ์šฉ๋„์ด๋‹ค.
  • while ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ด๋ถ„ํƒ์ƒ‰์„ ํ•˜๋Š”๋ฐ, s๊ฐ€ e๋ณด๋‹ค ์ž‘์„ ๋™์•ˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
    s์™€ e๋ฅผ ๋”ํ•œ ํ›„ 2๋กœ ๋‚˜๋ˆ„์–ด ์ค‘๊ฐ„ ๊ฐ’์„ ์ฐพ์•„ m ์ดˆ๊ธฐํ™”, value๊ฐ€ lis[m]๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๊ฒฝ์šฐ
    e๋ฅผ m์œผ๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๊ณ , value๊ฐ€ ํด ๊ฒฝ์šฐ์—๋Š” s๋ฅผ m+1๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.

๐Ÿ‘€ ์ •๋ฆฌ

์ด๋ถ„ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ LIS๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ , ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ–ˆ๋‹ค.

 

์ด์ „์—๋„ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ด๋ถ„ํƒ์ƒ‰์— ๋Œ€ํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ์ ์€ ์žˆ์ง€๋งŒ,์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋‹ฅ์ณค์„ ๋•Œ๋Š” ์ด๋ถ„ํƒ์ƒ‰์„ ์–ด๋–ค ์‹์œผ๋กœ ์ ์šฉํ•ด์•ผํ• ์ง€ ๋ชฐ๋ผ์‘์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค. ์—ฐ์Šต์ด ๋” ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

๋Œ“๊ธ€