Algorithm/μΈν”„λŸ°(inflearn)

[JavaScript/section 10] 03 - μ΅œλŒ€ λΆ€λΆ„ 증가 μˆ˜μ—΄

_μ„±ν˜Έ_ 2022. 12. 21. 21:18
728x90
λ°˜μ‘ν˜•

πŸ“Œ μ΅œλŒ€ λΆ€λΆ„ μ¦κ°€μˆ˜μ—΄(LIS)

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

 

μž…λ ₯μ„€λͺ…

첫째 쀄은 μž…λ ₯λ˜λŠ” λ°μ΄ν„°μ˜ 수 N(1<=N<=1,000, μžμ—°μˆ˜)λ₯Ό μ˜λ―Έν•˜κ³ , λ‘˜μ§Έ 쀄은 N개의 μž…λ ₯데이터듀이 주어진닀.

λ‘˜μ§Έ 쀄은 N개의 μž…λ ₯데이터듀이 주어진닀.

좜λ ₯μ„€λͺ…

첫 번째 쀄에 λΆ€λΆ„ 증가 μˆ˜μ—΄μ˜ μ΅œλŒ€ 길이λ₯Ό 좜λ ₯ν•œλ‹€.

μž…λ ₯예제 좜λ ₯예제
8
5 3 7 8 6 2 9 4
4

 

πŸ“ 풀이 방법

arr[ i ](인덱슀) - 증가 μˆ˜μ—΄μ—μ„œ λ§ˆμ§€λ§‰ 항에 ν•΄λ‹Ήν•˜λŠ” 숫자

dy[ i ] - arr[ i ] (i 번째 μ›μ†Œ)κ°€ μˆ˜μ—΄μ˜ λ§ˆμ§€λ§‰ 항에 ν•΄λ‹Ήν•œλ‹€λŠ” μ‘°κ±΄ν•˜μ— λΆ€λΆ„ 증가 μˆ˜μ—΄μ˜ 길이

닡을 μ°Ύμ•„κ°€λŠ” κ³Όμ •μ˜ ν•œ λΆ€λΆ„~

  • arr[3]에 ν•΄λ‹Ήν•˜λŠ” μ›μ†Œ 8이 증가 μˆ˜μ—΄μ˜ λ§ˆμ§€λ§‰ 항에 ν•΄λ‹Ήν•˜λŠ” 숫자둜 μ•žμ— μ‘΄μž¬ν•˜λŠ” μ›μ†Œλ“€κ³Ό λΉ„κ΅ν•œλ‹€.
  • μ•žμ— μ‘΄μž¬ν•˜λŠ” μ›μ†Œ 쀑 arr[3]보닀 μž‘μœΌλ©΄μ„œ λΆ€λΆ„ 증가 μˆ˜μ—΄μ˜ 길이가 κ°€μž₯ κΈ΄ 길이에 1(자기 μžμ‹  포함)을 λ”ν•œ 값을 dy[3]에 μ €μž₯ν•œλ‹€.
  • μœ„ 과정을 λ°˜λ³΅ν•œ ν›„ dy λ°°μ—΄μ˜ μ›μ†Œ 쀑 μ΅œλŒ€ 길이λ₯Ό κ΅¬ν•œλ‹€.
function solution(arr) {
  let answer = 0;
  let dy = Array.from({ length: arr.length }, () => 0);
  // arr[0] μ•žμ— μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 증가 μˆ˜μ—΄μ— 자기 μžμ‹ λ§Œ ν¬ν•¨ν•˜λ―€λ‘œ 1둜 μ΄ˆκΈ°ν™”
  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] && max < dy[j]) {
        max = dy[j];
      }
    }
    dy[i] = max + 1;
  }

  answer = Math.max(...dy);
  return answer;
}

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