๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

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

Longest Increasing Subsequence ๋ฅผ ์ค„์—ฌ์„œ LIS๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ˆ˜์—ด์—์„œ ์—ฐ์†์ ์œผ๋กœ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ์š”์†Œ๋“ค์„ ์—ฐ๊ฒฐ์‹œ์ผฐ์„ ๋•Œ, ๊ทธ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ๊ธธ์–ด์ง€๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ A๋ผ๋Š” ๋ฐฐ์—ด์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ’๋“ค์ด ๋“ค์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

index 0 1 2 3 4 5 6
A[index] 5 2 3 8 1 4 7

์ด ๊ฒฝ์šฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์€

  1. 5 > 8
  2. 2 > 3 > 8
  3. 2 > 3 > 4 > 7
  4. 3 > 8
  5. 3 > 4 > 7
  6. 1 > 4 > 7
  7. 4 > 7

์ด๊ณ , ์ด ์ค‘ ๊ธธ์ด๊ฐ€ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์€ 3๋ฒˆ์— ์žˆ๋Š” ๊ธธ์ด 4์งœ๋ฆฌ ์ˆ˜์—ด์ด๋‹ค.

 

LIS๋ฅผ ๊ตฌํ•˜๋Š” ์ „๋žต์€ 1) Dynamic Programming, 2) Segment Tree, 3) Binary Search ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ์•„์ง ๋‹ค ๊ณต๋ถ€ํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ณต๋ถ€ํ•  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

Dynamic Programming - O(n2)

DP๋กœ LIS๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์–ด๋–ค ํŠน์ •ํ•œ ์ง€์ ์˜ ์ตœ์žฅ ๊ธธ์ด๋Š” ํ•ด๋‹น ์ง€์  ์ด์ „์— ๋‚˜์™”๋˜ ์ˆ˜๋“ค ์ค‘, ๊ฐ’์ด ์ž‘์€ ์ˆ˜๋“ค์ด ๊ฐ€์ง„ ์ตœ์žฅ ๊ธธ์ด์— 1์„ ๋”ํ•˜๋ฉด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. DP์˜ ํŠน์ง•์„ ์‚ด๋ ค์„œ ์ฒซ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ตœ์žฅ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด๊ฐ€๋ฉด ์ˆ˜์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ, DP๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฐ์—ด dp์˜ dp[x]๋Š” x ์ง€์ ์—์„œ์˜ ์ตœ์žฅ ์ˆ˜์—ด ๊ธธ์ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฐ์—ด A๋ฅผ ์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณด์ž.

index 0 1 2 3 4 5 6
A[index] 5 2 3 8 1 4 7
  1. A์˜ ์ œ์ผ ์ฒ˜์Œ ์ธ๋ฑ์Šค์ธ A[0]๋Š” ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด๊ฐ€ ํ•ญ์ƒ 1์ด๋‹ค. ์ž๊ธฐ ์ด์ „์— ์ˆ˜์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ dp[0]์—๋Š” 1์ด ๋“ค์–ด๊ฐ„๋‹ค.
  2. A[1]์˜ LIS๋Š” A[1] ์˜ ๊ฐ’์ด A[0] ๋ณด๋‹ค ํด ๊ฒฝ์šฐ์—๋Š” 2, ์ž‘์„ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ์‹œ์ž‘์ด๋ฏ€๋กœ 1์ด ๋  ๊ฒƒ์ด๋‹ค.
  3. A[2]์˜ LIS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • A[2] > A[0], A[2] < A[1] :
      ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— A[0]๋ž‘ ์—ฐ๊ฒฐ์‹œ์ผœ์„œ ๊ธธ์ด๋ฅผ 2๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    • A[2] > A[1], A[2] < A[0] :
      ๊ฐ€์žฅ ๊ธด ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— A[1]๋ž‘ ์—ฐ๊ฒฐ์‹œ์ผœ์„œ ๊ธธ์ด๋ฅผ 2๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    • A[2] > A[1], A[2] > A[0] :
      A[0]์™€ A[1] ์ค‘ ๊ธธ์ด๊ฐ€ ๋” ๊ธด ๊ฐ’๊ณผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
    • A[2] < A[0], A[2] < A[1] :
      ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ„๋‹ค.

์œ„ ์„ธ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ๋‹น, ํ•ด๋‹น ์ธ๋ฑ์Šค ์ด์ „์— ๋‚˜์™”๋˜ ๋ชจ๋“  ์ธ๋ฑ์Šค๋“ค์˜ ๊ฐ’์ด ๊ฐ€์ง„ LIS๋ฅผ ํ™•์ธํ•ด์•ผํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ์‹์€ O(n2) ์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

์œ„ ๋‚ด์šฉ์„ ์ผ๋ฐ˜ํ™”ํ•ด์„œ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž

 for (int i = 0 ; i < A.size() ; i++){
        if (dp[i] == 0) dp[i] = 1; // ์ผ๋‹จ ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ์œ„์น˜๋Š” ๋ฌด์กฐ๊ฑด 1๋กœ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ
        for (int j = 0 ; j < i ; j++){
            if(A[i] > A[j] && dp[j]+1 > dp[i]){ // ๊ธฐ์ค€์ด ๋˜๋Š” ์ธ๋ฑ์Šค ์ด์ „๊นŒ์ง€ ๋ชจ๋‘ ๋Œ๋ฉด์„œ ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฐ’๊ณ  ํฌ๋ฉด์„œ LIS๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
                dp[i] = dp[j]+1; // ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น LIS์— 1์„ ๋”ํ•œ ๊ฐ’์„ ํ˜„์žฌ ์œ„์น˜์˜ ๊ธธ์ด๋กœ ์ง€์ •
            }
        }
    }

์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•œ๋‹ค.

if(A[i] > A[j] && dp[j]+1 > dp[i])

์ด ์กฐ๊ฑด์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ œ์ผ ํฐ LIS ๊ฐ’์„ ์ฐพ์•„์„œ ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ์— ๋„ฃ์–ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, dp[i]์€ ์ฒ˜์Œ์— 1๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ด ๋˜๋Š” ๊ธธ์ด๋“ค์„ ๋งŒ๋‚˜๋ฉด ๊ณ„์† dp[i] ๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

 

dp[j]+1์„ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” dp[i] ๊ฐ€ 1 ์ผ ๊ฒฝ์šฐ์— ์ด์–ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” dp[j]๊ฐ€ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์„ ๋Š˜๋ ค์ฃผ์–ด์„œ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.