[백준] 11053 가장 긴 증가하는 부분 수열 Node.js

Janet·2023년 11월 7일
0

Algorithm

목록 보기
288/314

문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {1020, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

예제 입력 1

6
10 20 10 30 20 50

예제 출력 1

4

문제풀이

  1. const dp = new Array(n).fill(1);
    • dp 배열을 생성하고 모든 원소를 1로 초기화한다. 이 배열은 각 숫자에서 시작하는 가장 긴 증가하는 부분 수열의 길이를 저장한다. 모든 원소를 1로 초기화하는 이유는 각 숫자 자체로 하나의 증가하는 부분 수열이 만들어지기 때문이다.
  2. for (let i = 1; i < n; i++) { ... }
    • 루프를 이용하여 각 숫자에서 시작하는 가장 긴 증가하는 부분 수열의 길이를 계산한다.
  3. for (let j = 0; j < i; j++) { ... }
    • 현재 숫자(nums[i])를 이전 숫자들(nums[0]부터 nums[i-1])과 비교하면서 가장 긴 증가 부분 수열을 찾는다.
  4. if (nums[i] > nums[j] && dp[i] < dp[j] + 1) { ... }
    • dp[i]를 계산하기 위해서 i 이전의 위치들 j를 검사하면서, 현재 숫자(nums[i])가 이전 숫자(nums[j])보다 크고, dp[j]에 1을 더한 값이 dp[i]보다 큰 경우 dp[i]dp[j] + 1로 업데이트한다. 이것은 현재 위치 i에서 가장 긴 증가 부분 수열의 길이를 구하는 과정이다.

ex) 입력값 수열: [10, 20, 10, 30, 20, 50]

▼ dp 배열 변화 과정
[ 1, 1, 1, 1, 1, 1 ],
[ 1, 2, 1, 1, 1, 1 ],
[ 1, 2, 1, 2, 1, 1 ],
[ 1, 2, 1, 3, 1, 1 ],
[ 1, 2, 1, 3, 2, 1 ],
[ 1, 2, 1, 3, 2, 2 ],
[ 1, 2, 1, 3, 2, 3 ],
[ 1, 2, 1, 3, 2, 4 ]

✅ 답안

const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const [n, ...nums] = require('fs').readFileSync(filePath).toString().trim().split(/\s/).map(Number);
const dp = new Array(n).fill(1);

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

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

0개의 댓글