만두맨두
만두 개발자 되다.
만두맨두
전체 방문자
오늘
어제
  • 분류 전체보기 (27)
    • 면접준비 (2)
    • GitHub (1)
    • JavaScript (5)
    • TypeScript (6)
    • REACT (1)
    • 에러 해결일지 (2)
    • 알고리즘 (7)
      • 이론 (4)
      • 자료구조 (1)
      • 프로그래머스 (2)
    • 만두의 일기 (1)
    • 프로젝트 (2)
      • 팀블로그 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • dynamic programming
  • telling me
  • Beakjoon
  • frontend
  • node.js
  • 배열의 길이
  • 호이스팅
  • hoisting
  • 우선순위큐
  • 타입챌린지
  • TellingUs
  • Algorithm
  • programmers
  • 프로그래머스
  • 자바스크립트
  • JS
  • 타입 챌린지
  • eslint
  • 다이나믹 프로그래밍
  • type-challenges
  • dp
  • TypeScript
  • react
  • length
  • JavaScript
  • 점 표기법
  • 대괄호 표기법
  • PriorityQueue
  • 00018-easy-tuple-length
  • 네임스페이스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
만두맨두

만두 개발자 되다.

알고리즘/이론

가장 긴 증가하는 부분 수열 (LIS problem)

2023. 1. 19. 17:11

Longest Increasing Subsequence

길이가 1이상인 수열이 주어질 때,

가장 길고, 증가하는 부분 수열의 길이를 찾는 문제

 

다이나믹 프로그래밍(DP, Dynamic Programming)을 사용해야 한다.

 

1. 시간 복잡도가 N^2인 알고리즘

A = { 10, 20, 30, 10, 20, 50 }

 

DP에 넣어야 하는 정보는 A[ i ]로 끝나는 가장 긴 증가하는 부분 수열의 길이이다.

 

1 ) 인덱스 1은 무조건 1의 길이를 갖는다.

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1          

 

2 ) 두 번째 부터는 A[ 0 ]부터 A[ i - 1 ]중에 A[ i ]보다 작은 값을 찾고,

      해당 인덱스의 DP가 가장 큰 값을 찾는다.

      그리고 해당 DP의 값에 1을 더한 값이 DP[ i ]이다.

 

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1 2        

     step 1. A[ 0 ]부터 A[ i - 1]중에 A[ i ]보다 작은 수의 인덱스

                    0, 1

     step 2. 위의 인덱스 중, DP가 가장 큰 값의 인덱스

                    1

 

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1 2 3      

     step 1. A[ 0 ]부터 A[ i - 1]중에 A[ i ]보다 작은 수의 인덱스

                    0, 1, 2

     step 2. 위의 인덱스 중, DP가 가장 큰 값의 인덱스

                    2

 

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1 2 3 1    

     step 1. A[ 0 ]부터 A[ i - 1]중에 A[ i ]보다 작은 수의 인덱스

                    0

     step 2. 위의 인덱스 중, DP가 가장 큰 값의 인덱스

                    0

 

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1 2 3 1 2  

     step 1. A[ 0 ]부터 A[ i - 1]중에 A[ i ]보다 작은 수의 인덱스

                    0, 1, 4

     step 2. 위의 인덱스 중, DP가 가장 큰 값의 인덱스

                    1, 4

 

index 0 1 2 3 4 5 6
A 0 10 20 30 10 20 50
DP 0 1 2 3 1 2 4

     step 1. A[ 0 ]부터 A[ i - 1]중에 A[ i ]보다 작은 수의 인덱스

                    0, 1, 2, 3, 4, 5

     step 2. 위의 인덱스 중, DP가 가장 큰 값의 인덱스

                    3

 

 

자바스크립트 코드

let dp = [0, 1];
for (let i = 2; i <= n; i++) {
  let max = 0;

  for (let j = 1; j < i; j++) {
    if (as[i] > as[j]) {
      max = Math.max(max, dp[j]);
    }
  }

  dp.push(max + 1);
}

console.log(Math.max(...dp));

 

'알고리즘 > 이론' 카테고리의 다른 글

유클리드 호제법 (Euclidean algorithm)  (0) 2023.02.19
최장 공통 부분 수열 (LCS problme)  (0) 2022.12.20
배낭 문제 (Knapsack Problem)  (0) 2022.11.25
    '알고리즘/이론' 카테고리의 다른 글
    • 유클리드 호제법 (Euclidean algorithm)
    • 최장 공통 부분 수열 (LCS problme)
    • 배낭 문제 (Knapsack Problem)
    만두맨두
    만두맨두
    프론트엔드 개발자가 되고 싶다 !

    티스토리툴바