수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
6
10 20 10 30 20 50
4
const dp = new Array(n).fill(1);
for (let i = 1; i < n; i++) { ... }
for (let j = 0; j < i; j++) { ... }
nums[i]
)를 이전 숫자들(nums[0]
부터 nums[i-1]
)과 비교하면서 가장 긴 증가 부분 수열을 찾는다.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));