๐ 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
์ ํน์ง ์ค ํ๋์ธ ๊ฐ ๋จ๊ณ๋ณ๋ก ์ชผ๊ฐ ๋ค์, ์ด์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- dy[j]: arr[i]๋ฅผ ์ ์ผ ๋ง์ง๋ง์ ๋ ๋ ๋ง๋ค ์ ์๋ ์์ด์ ์ต๋ ๊ธธ์ด
- ๋งจ ์ฒ์ 1๊ฐ์ง์ ์๋ก ๋ง๋ค ์ ์๋ ์ต๋ ์์ด์ ๊ธธ์ด๋ 1์ด๋ค. (dp[0]=1)
- ์๋ฅผ ๋ค์ด 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])
- arr[3]์ผ ๋๋ 8์ ๊ฐ๋ฆฌํค๋๋ฐ, 8๋ณด๋ค ์์ ๊ฐ ์ค ์ ์ผ ํฐ ๊ฐ์ 7(์ด๋ dp[j]=2), 7 ๋ค์ 8์ ๋๋ฉด ์ต์ฅ ์ฆ๊ฐ ์์ด์ ๊ฐฑ์ ํ ์ ์๋ค. (์ด๋ 2๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ 5 7 8, 3 7 8์ด๊ณ ์์ด์ ๊ธธ์ด๋ 3์ด๋ค.)
// ์
๋ ฅ
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
๋๊ธ