๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section10 - 3 - ์ตœ์žฅ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด(LIS)

by YWTechIT 2021. 10. 14.
728x90

๐Ÿ“ section10 - 3 - ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด(LIS)

๋ฌธ์ œ: N๊ฐœ์˜ ์ž์—ฐ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š”(์ž‘์€ ์ˆ˜์—์„œ ํฐ ์ˆ˜๋กœ) ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›์†Œ๊ฐ€ 2, 7, 5, 8, 6, 4, 7, 12, 3์ด๋ฉด ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋„๋ก ์›์†Œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ฝ‘์•„๋‚ด๋ฉด 2, 5, 6, 7, 12๋ฅผ ๋ฝ‘์•„๋‚ด๊ณ  ๊ธธ์ด๊ฐ€ 5์ธ ์ตœ๋Œ€๋ถ€๋ถ„์ฆ๊ฐ€์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” LIS ๋ฌธ์ œ์ธ๋ฐ, ์ €๋ฒˆ์— ํ˜„๋Œ€์นด๋“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ LIS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์—ˆ๋‹ค. (๋ฌผ๋ก  ๊ทธ๋•Œ๋Š” ๋ชฐ๋ผ์„œ ๋ชป ํ’€์—ˆ๋‹ค. ๐Ÿฅฒ ) ์ด๋ฒˆ๊ธฐํšŒ์— ๋ฐฐ์šฐ๊ณ  ๋‹ค์Œ์— LIS ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ง๋”ํ•˜๊ฒŒ ํ’€์–ด๋ฒ„๋ฆฌ์ž. LIS๋ฌธ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, DP์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ชผ๊ฐ  ๋‹ค์Œ, ์ด์ „์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

  1. dy[j]: arr[i]๋ฅผ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋‘˜ ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด
  2. ๋งจ ์ฒ˜์Œ 1๊ฐ€์ง€์˜ ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” 1์ด๋‹ค. (dp[0]=1)
  3. ์˜ˆ๋ฅผ ๋“ค์–ด i===3 ์ผ ๋•Œ, dy[3]์„ ๊ตฌํ•˜๋ ค๋ฉด arr[3]์„ ๊ธฐ์ค€์œผ๋กœ i-1~0๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ arr[3]๊ณผ arr[j]์˜ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋งŒ์•ฝ, arr[i] > arr[j]๋ผ๋ฉด, dp[j] ์ค‘ ์ œ์ผ ํฐ ๊ฐ’์— +1์„ ํ•ด์„œ dp[i]์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. (+1์„ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ๋‚˜๋ฅผ ์ œ์™ธํ•œ ํ˜„์žฌ ์ตœ๋Œ€ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ dp[j]์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋‚˜๋ฅผ ๋ถ™์ด๋ฉด ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” 1 ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.) ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์ด์ „์˜ dp[j]๋งŒ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  i-1~0๊นŒ์ง€ ๋ชจ๋“  dp[j]๋ฅผ ์กฐ์‚ฌํ•˜๋ฏ€๋กœ dp[j]>max ์กฐ๊ฑด์„ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ์–ด max ๋ณ€์ˆ˜๋ฅผ ์ตœ๋Œ€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.(dp[j] > max๋ฉด max=dp[j])
  4. arr[3]์ผ ๋•Œ๋Š” 8์„ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, 8๋ณด๋‹ค ์ž‘์€ ๊ฐ’ ์ค‘ ์ œ์ผ ํฐ ๊ฐ’์€ 7(์ด๋•Œ dp[j]=2), 7 ๋’ค์— 8์„ ๋‘๋ฉด ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด์„ ๊ฐฑ์‹  ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด๋•Œ 2๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ 5 7 8, 3 7 8์ด๊ณ  ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” 3์ด๋‹ค.)

 

 

 

728x90

 

 

// ์ž…๋ ฅ
8
5 3 7 8 6 2 9 4

// ์ฝ”๋“œ
let n = 8;
let arr = [5, 3, 7, 8, 6, 2, 9, 4];

console.log(solution(n, arr));

function solution(n, arr){
  if (n === 1) return 1;
  let dp = Array.from({length: n}, () => 0);
  let answer = 0;

  dp[0]=1;

  for (let i=1; i<n; i++){
    let max=0;
    for (let j=i-1; j>=0; j--){
      if (arr[i] > arr[j] && dp[j] > max) max = dp[j]
    }
    dp[i]=max+1;
    answer = Math.max(answer, dp[i]);
  }
  return answer;
}

๐Ÿ‘‰๐Ÿฝ 4
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€