Algorithm

LIS (Longest Increasing Sequence)

quedevel 2023. 4. 14. 17:35
728x90
반응형

LIS(Longest Increasing Subsequence)란 주어진 배열에서 가장 길게 증가하는 부분 수열을 찾는 문제입니다. 즉, 주어진 배열에서 임의의 숫자 i에서 j로 갈 수 있을 때 i < j인 경우에만 갈 수 있다면, 이때 가장 길게 이어지는 부분 수열을 찾는 것입니다.

 

LIS ( with Javascript )

function lis(arr) {
  let dp = new Array(arr.length).fill(1);
  let max = 0;

  for (let i = 1; i < arr.length; i++) {
    for (let j = 0; j < i; j++) {
      if (arr[i] > arr[j] && dp[i] < dp[j] + 1) {
        dp[i] = dp[j] + 1;
      }
    }
  }

  for (let i = 0; i < dp.length; i++) {
    if (max < dp[i]) {
      max = dp[i];
    }
  }

  return max;
}

let arr = [3, 2, 6, 4, 5, 1];
console.log(lis(arr)); // 3 (최장 부분 증가 수열: [2, 4, 5] 또는 [2, 4, 6])

// arr:  3 2 6 4 5 1
// dp:   1 1 2 2 3 1

 

위 코드에서는 DP 배열 dp을 생성하여 각 원소를 마지막에 넣을 경우의 가장 긴 부분 수열을 저장합니다. 이때, dp[i] arr[i]를 마지막으로 하는 부분 수열의 길이를 나타냅니다. 그리고 배열 dp를 모두 탐색하여 가장 큰 값을 반환하면 됩니다.

따라서, 가장 긴 증가하는 부분 수열의 길이는 3입니다.

 

 

728x90
반응형

'Algorithm' 카테고리의 다른 글

LCA(Lowest Common Ancestor)  (1) 2023.04.15
DFS & BFS  (0) 2023.04.14
해시 테이블(Hash Table)  (0) 2023.04.12
이분 탐색(Binary Search)  (0) 2023.04.12
정렬(Sort)  (0) 2023.04.10