Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Basic

[์•Œ๊ณ ๋ฆฌ์ฆ˜] (Swift) ์ตœ๊ฐ• ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS) ์•Œ๊ณ ๋ฆฌ์ฆ˜ (DP, ๋™์ ๊ณ„ํš๋ฒ•์„ ํ™œ์šฉํ•œ LIS)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 13. 11:36
๋ฐ˜์‘ํ˜•

์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS,Longest Increasing Subsequence) ์ด๋ž€?

์–ด๋–ค ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์ˆ˜์—ด์—์„œ ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋“ค์„ ์ œ๊ฑฐํ•ด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด์„ "์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด"์ด๋ผ๊ณ  ํ•œ๋‹ค. - ๋‚˜๋ฌด์œ„ํ‚ค ๐ŸŒณ

โ–ท ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

[ 3, 5, 7, 9, 2, 1, 4, 8]

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์—ด์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ์ˆ˜์—ด์—์„œ ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ด์„œ ๋ถ€๋ถ„์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์„ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ•˜์˜€๋Š”๋ฐ, ์ฆ‰, '๊ณต์ฐจ'๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋ถ€๋ถ„์ˆ˜์—ด์ด๋ผ๊ณ  ๋ณธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (๊ทœ์น™์ ์ด์ง€ ์•Š๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋ฉด ๋œ๋‹ค๋Š” ๋œป) ๋”ฐ๋ผ์„œ ์œ„ ์ˆ˜์—ด์—์„œ ๋„์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์€ ํ•œ ๊ฐ€์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

[3, 7, 9, 1, 4, 8] -- (5, 2 ์ œ๊ฑฐ)
[7, 9, 1, 8] -------- (3, 5, 2, 4 ์ œ๊ฑฐ)
[3, 5, 7, 8] -------- (9, 2, 1, 4 ์ œ๊ฑฐ)
[1, 4, 8] ----------- (3, 5, 7, 9, 2 ์ œ๊ฑฐ)

์ด๋ ‡๊ฒŒ ๋„์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ˆ˜์—ด ์ค‘, ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋ฉด์„œ, ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์ด LIS ๋ผ๊ณ  ํ•œ๋‹ค. 

 

๐Ÿ’๐Ÿป‍โ™€๏ธ LIS๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

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

๐Ÿ‘‰๐Ÿป DP(๋™์  ๊ณ„ํš๋ฒ•) ์ด์šฉํ•ด์„œ LIS ๊ตฌํ•˜๊ธฐ : O(N^2)

๋ฐฐ์—ด D[i] ๋Š” i๋ฒˆ์งธ ์ธ๋ฑ์Šค์—์„œ ๋๋‚˜๋Š” ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ถ€๋ถ„์ˆ˜์—ด A์˜ i๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์–ด๋–ค ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” A[i]๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ์ „ ์ฆ๊ฐ€ ๋ถ€๋ถ„์ˆ˜์–ผ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด A[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ A[i]๋ฅผ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” A[i]๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด์˜ ๊ธธ์ด์— 1์„ ๋”ํ•œ ๊ฐ’์ด ๋œ๋‹ค.

โ–ท ๋น ๋ฅธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

[3, 5, 7, 9, 2, 1, 4, 8]

์ด ์ˆ˜์—ด์„ ํ™œ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ดํŽด๋ณด์ž. (์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ทœ์น™์˜ ํ˜•์„ฑ์„ ์œ„ํ•ด i=0์„ ์ถ”๊ฐ€ํ–ˆ๊ณ , i=0์ผ๋•Œ D[0] = 0 ์ด๋‹ค.)

i=1 ์ผ ๋•Œ๋ฅผ ์‚ดํŽด๋ณด์ž. A[1] = 3 ์ด๋‹ค. 3์€ A[0] = 0 ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[1] = D[0] + 1 = 1 ์ด๋‹ค.

i=2์ผ ๋•Œ๋ฅผ ๋ณด์ž. A[2] = 5 ์ด๋‹ค. 5๋Š” A[0] = 0, A[1] = 3 ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ D[0] = 0, D[1] = 1 ์—์„œ D[1]์ด ๊ฐ€์žฅ ํฌ๋‹ค. ์ด ๋ง์€ A[1]=3 ์„ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ๊ธธ๋‹ค๋Š” ๋œป์ด๋‹ค. A[2]๊ฐ€ ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด ๋’ค์— ๋ถ™๋Š”๊ฒŒ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€๋ถ€๋ถ„์ˆ˜์—ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[2]=D[1]+1 = 2 ์ด๋‹ค.

i=3, i=4 ์ผ ๋•Œ๋„, ์œ„์™€ ๋™์ผํ•œ ๊ทœ์น™์„ฑ์— ์˜ํ•ด ๋ชจ๋‘ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[3] = D[2] +1 = 3 ์ด ๋˜๊ณ , D[4] = D[3]+1 =4 ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์ž ๊ทธ๋Ÿผ ์ด์ œ i=5 ์ผ ๋•Œ๋ฅผ ์‚ดํŽด๋ณด์ž. A[5] = 2 ์ด๋ฏ€๋กœ, A[0] ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[5] = D[0] + 1 = 1์ด ๋œ๋‹ค.

i = 6์ผ๋•Œ๋Š” D[6] = 1 ์ด๋ฏ€๋กœ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ A[0] ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[6] = D[0] +1 = 1 ์ด ๋œ๋‹ค. i=7์€ A[7] = 4 ์ด๋ฏ€๋กœ, A[1] = 3 ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ D[7] = D[1] + 1 = 2 ๊ฐ€ ๋œ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ i = 8 ์ผ๋•Œ๋Š”, A[3] = 7 ๋’ค์— ๋ถ™์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, D[8] = D[3] +1 = 4 ๊ฐ€ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ฐฐ์—ด D ๋ฅผ ๋ชจ๋‘ ์™„์„ฑ์‹œ์ผฐ๋‹ค. D์˜ ๊ฐ’๋“ค ์ค‘, ๊ฐ€์žฅ ํฐ 4๊ฐ€ ํ•ด๋‹น ์ˆ˜์—ด์˜ LIS ๊ธธ์ด๊ฐ€ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ DP ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๋ณด๋ฉด, i ๊ฐœ์˜ ์ˆ˜์—ด์ด ์žˆ์„ ๋•Œ, i ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ์Šค์œ„ํ”„ํŠธ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

let A = [3, 5, 7, 9, 2, 1, 4, 8]
var D: [Int] = []

for k in 0..<A.count {
    D.append(1)
    for i in 0..<k+1 {
        if A[i] < A[k] {
            D[k] = max(D[k], D[i] + 1)
        }
    }
}

print(D)

์œ„์—์„œ D[i] ๋Š” i ๋ฒˆ์งธ ์ธ๋ฑ์Šค์—์„œ ๋๋‚˜๋Š” ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ’์„ max ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1.  i ๋ฒˆ์งธ ์ธ๋ฑ์Šค์—์„œ ๋๋‚˜๋Š” ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰์— A[k]๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ์˜ LIS ๊ธธ์ด์™€, 
  2. ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ D[k] ๊ฐ’
  3. ๋‘˜ ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ D[k] ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

 

โœ๐Ÿป ์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@seho100/%EC%B5%9C%EA%B0%95-%EC%A6%9D%EA%B0%80-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4LIS-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4

 

๋ฐ˜์‘ํ˜•