|
| 1 | +/** |
| 2 | + * ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(Longest Increasing Subsequence, LIS)'์ ๊ตฌํ๊ธฐ |
| 3 | + * ๋ถ๋ถ ์์ด(Subsequence): ์๋ ์์ด์์ ๋ช ๊ฐ์ ์์๋ฅผ ๊ณจ๋ผ์ ์์๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋์ดํ ๊ฒ |
| 4 | + * ์ฆ๊ฐ ๋ถ๋ถ ์์ด(Increasing Subsequence): ๋ถ๋ถ ์์ด์ ์์๋ค์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๊ฒ |
| 5 | + * |
| 6 | + * ์ ๊ทผ๋ฐฉ๋ฒ: ๋์ ๊ณํ๋ฒ(DP) ๋๋ ์ด์งํ์(Binary Search) |
| 7 | + * 1. DP๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ: ์๊ฐ๋ณต์ก๋ O(n^2) |
| 8 | + * 2. ์ด์งํ์์ ์ด์ฉํ ๋ฐฉ๋ฒ: ์๊ฐ๋ณต์ก๋ O(n log n) โ
follow-up ๊ณ ๋ ค |
| 9 | + */ |
| 10 | + |
| 11 | +/** ๋์ ๊ณํ๋ฒ(DP)์ผ๋ก ์ ๊ทผ |
| 12 | + * @param {number[]} nums |
| 13 | + * @return {number} |
| 14 | + */ |
| 15 | +var lengthOfLIS = function (nums) { |
| 16 | + if (nums.length === 0) return 0; |
| 17 | + |
| 18 | + // dp[i]๋ ์ธ๋ฑ์ค i๊น์ง์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด |
| 19 | + const dp = Array(nums.length).fill(1); |
| 20 | + |
| 21 | + // ๋ชจ๋ ์์น์ ๋ํด ๊ฒ์ฌ |
| 22 | + for (let i = 1; i < nums.length; i++) { |
| 23 | + // ํ์ฌ ์์น๋ณด๋ค ์ด์ ์ ๋ชจ๋ ์์น๋ฅผ ๊ฒ์ฌ |
| 24 | + for (let j = 0; j < i; j++) { |
| 25 | + // ํ์ฌ ๊ฐ์ด ์ด์ ๊ฐ๋ณด๋ค ํฌ๋ฉด, ์ด์ ์์น์ LIS์ ํ์ฌ ๊ฐ์ ์ถ๊ฐํ ์ ์์ |
| 26 | + if (nums[i] > nums[j]) { |
| 27 | + // ๊ธฐ์กด ๊ฐ๊ณผ (์ด์ ์์น์ LIS ๊ธธ์ด + 1) ์ค ๋ ํฐ ๊ฐ์ ์ ํ |
| 28 | + dp[i] = Math.max(dp[i], dp[j] + 1); |
| 29 | + } |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + // dp ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ๊ฐ์ด LIS์ ๊ธธ์ด |
| 34 | + return Math.max(...dp); |
| 35 | +}; |
| 36 | + |
| 37 | +/** ์ด์งํ์(Binary Search)์ผ๋ก ์ ๊ทผ |
| 38 | + * @param {number[]} nums |
| 39 | + * @return {number} |
| 40 | + */ |
| 41 | +var lengthOfLIS = function (nums) { |
| 42 | + if (nums.length === 0) return 0; |
| 43 | + |
| 44 | + // tails[i]๋ ๊ธธ์ด๊ฐ i+1์ธ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง ์์ ์ค ๊ฐ์ฅ ์์ ๊ฐ |
| 45 | + const tails = []; |
| 46 | + |
| 47 | + for (let num of nums) { |
| 48 | + // ์ด์ง ํ์์ผ๋ก num์ด ๋ค์ด๊ฐ ์์น ์ฐพ๊ธฐ |
| 49 | + let left = 0; |
| 50 | + let right = tails.length; |
| 51 | + |
| 52 | + while (left < right) { |
| 53 | + const mid = Math.floor((left + right) / 2); |
| 54 | + if (tails[mid] < num) { |
| 55 | + left = mid + 1; |
| 56 | + } else { |
| 57 | + right = mid; |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + // ์ฐพ์ ์์น์ num ์ฝ์
๋๋ ๋์ฒด |
| 62 | + if (left === tails.length) { |
| 63 | + tails.push(num); // ์๋ก์ด ์ต์ฅ ๊ธธ์ด ๋ฐ๊ฒฌ |
| 64 | + } else { |
| 65 | + tails[left] = num; // ๊ธฐ์กด ๊ฐ ๊ฐฑ์ |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + // tails ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ LIS์ ๊ธธ์ด |
| 70 | + return tails.length; |
| 71 | +}; |
0 commit comments