μ•Œκ³ λ¦¬μ¦˜/νƒœκ·Έ 별 풀이

[LIS]μ΅œλŒ€ λΆ€λΆ„ 증가 μˆ˜μ—΄

choi95 2021. 8. 16. 15:43

문제

N개의 μžμ—°μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ·Έ μ€‘μ—μ„œ κ°€μž₯ 길게 μ¦κ°€ν•˜λŠ”(μž‘μ€ μˆ˜μ—μ„œ 큰 수둜) μ›μ†Œλ“€μ˜ 집합을 μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 예λ₯Ό λ“€μ–΄, μ›μ†Œκ°€ 2, 7, 5, 8, 6, 4, 7, 12, 3 이면 κ°€μž₯ 길게 μ¦κ°€ν•˜λ„λ‘ μ›μ†Œλ“€μ„ μ°¨λ‘€λŒ€λ‘œ 뽑아내면 2, 5, 6, 7, 12λ₯Ό 뽑아내어 길이가 5인 μ΅œλŒ€ λΆ€λΆ„ 증가 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

 

λ¬Έμ œν’€μ΄

졜μž₯ 증가 λΆ€λΆ„ μˆ˜μ—΄(LIS, Longest Increasing Subsequence)

  • μ›μ†Œκ°€ n개인 λ°°μ—΄μ˜ 일뢀 μ›μ†Œλ₯Ό κ³¨λΌλ‚΄μ„œ λ§Œλ“  λΆ€λΆ„ μˆ˜μ—΄ 쀑, 각 μ›μ†Œκ°€ 이전 μ›μ†Œλ³΄λ‹€ ν¬λ‹€λŠ” 쑰건을 λ§Œμ‘±ν•˜κ³ , κ·Έ 길이가 μ΅œλŒ€μΈ λΆ€λΆ„ μˆ˜μ—΄μ„ 일컫음

ν•΄λ‹Ή λ¬Έμ œμ—μ„œ 길이가 μ΅œλŒ€μΈ λΆ€λΆ„μˆ˜μ—΄μ˜ κ°’λ§Œμ„ μ°Έμ‘°ν•˜μ—¬ 1을 κ°€μ‚°ν•œλ‹€λŠ” ν’€μ΄λŠ” λ‹€μŒ ν¬μŠ€νŒ…μ˜ 문제λ₯Ό ν’€μ–΄ λ΄„μœΌλ‘œμ¨ μ’€ 더 μ‰½κ²Œ 이해할 수 μžˆμ—ˆλ‹€.

https://choi95.tistory.com/33?category=854389 

 

λ³΄μ΄λŠ” 학생

 μ„ μƒλ‹˜μ΄ N(1<=N<=1000)λͺ…μ˜ 학생을 일렬둜 μ„Έμ› λ‹€. 일렬둜 μ„œ μžˆλŠ” ν•™μƒμ˜ ν‚€κ°€ μ•žμ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 맨 μ•žμ— μ„œ μžˆλŠ” μ„ μƒλ‹˜μ΄ λ³Ό 수 μžˆλŠ” ν•™μƒμ˜ 수λ₯Ό κ΅¬ν•˜κ³ μž ν•œλ‹€. (μ•žμ— μ„œ μžˆλŠ”

choi95.tistory.com

 

μ½”λ“œ

function solution(arr) {
  let answer = 0;
  let dy = Array.from({length: arr.length}, () => 0);
  dy[0] = 1;

  for(let i = 1; i < arr.length; i++) {
    let max = 0; //μ–΄λ– ν•œ μ›μ†Œμ˜ 값보닀 크지 μ•Šμ„ 경우 κ·Έ 값이 자기 μžμ‹ λ§Œμ„ ν¬ν•¨ν•œ 경우의 수인 1둜 μ΄ˆκΈ°ν™” 될 수 μžˆλ„λ‘
    for(let j = i - 1; j >= 0; j--) {
      if(arr[i] > arr[j] && dy[j] > max) { //이전 μ›μ†Œλ³΄λ‹€ 크고 ν•΄λ‹Ή μ›μ†Œμ˜ λΆ€λΆ„μˆ˜μ—΄μ΄ 졜μž₯일 경우
        max = dy[j];
      }
    }
    dy[i] = max + 1;
  }
  answer = Math.max(...dy);
  return answer;
}

let arr = [5, 3, 7, 8, 6, 2, 9, 4];
console.log(solution(arr));

function solution(arr){  
                let answer=0;
                let dy=Array.from({length:arr.length}, ()=>0);
                dy[0]=1;
                for(let i=1; i<arr.length; i++){
                    let max=0;
                    for(let j=i-1; j>=0; j--){
                        if(arr[j]<arr[i] && dy[j]>max){
                            max=dy[j];
                        }
                    }
                    dy[i]=max+1;
                    answer=Math.max(answer, dy[i]);
                }
                return answer;
            }

            let arr=[5, 3, 7, 8, 6, 2, 9, 4];
            console.log(solution(arr));