백준 11055번: 가장 큰 증가 부분 수열 - javascript
백준 11055번: 가장 큰 증가 부분 수열
문제 설명
수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 합이 가장 큰 증가 부분 수열의 합을 출력한다.
접근
이 문제는 14002번 가장 긴 증가하는 부분 수열 4와 똑같다.
그냥 다를게 없다.
다른점이라하면 이번엔 수열의 길이가 아니라 합을 비교하는 정도?… 
그리고 합을 비교하기 위해 원본배열과 dp배열 맨앞에 강제로 0을 추가했다는 정도이다.
풀이는 다음과 같다.
| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|---|---|
| 원본 배열 | - | 1 | 100 | 2 | 50 | 60 | 3 | 5 | 6 | 7 | 8 | 
| dp 배열 | 0 | - | - | - | - | - | - | - | - | - | - | 
이렇게 원본과 dp배열 맨앞에 0을 두고 시작한다.
| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|---|---|
| 원본 배열 | - | 1 | 100 | 2 | 50 | 60 | 3 | 5 | 6 | 7 | 8 | 
| dp 배열 | 0 | 1 | - | - | - | - | - | - | - | - | - | 
1번째값 1보다 작은 수 들 중에서 최대값은 0이므로 dp[1]은 1이다.
| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|---|---|
| 원본 배열 | - | 1 | 100 | 2 | 50 | 60 | 3 | 5 | 6 | 7 | 8 | 
| dp 배열 | 0 | 1 | 101 | - | - | - | - | - | - | - | - | 
2번째값 100보다 작은 수 들 중에서 최대값은 1이므로 dp[2]는 100+1이다.
| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|---|---|
| 원본 배열 | - | 1 | 100 | 2 | 50 | 60 | 3 | 5 | 6 | 7 | 8 | 
| dp 배열 | 0 | 1 | 101 | 3 | - | - | - | - | - | - | - | 
3번째값 2보다 작은 수 들 중에서 최대값은 1이므로 dp[3]은 1+2… 
이런식으로 진행하게되면 우리는 아래와 같은 결과물을 얻게 된다.
| - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
|---|---|---|---|---|---|---|---|---|---|---|---|
| 원본 배열 | - | 1 | 100 | 2 | 50 | 60 | 3 | 5 | 6 | 7 | 8 | 
| dp 배열 | 0 | 1 | 101 | 3 | 53 | 113 | 5 | 10 | 16 | 23 | 31 | 
이렇게 나온 dp배열의 max값을 반환하면 정답이 나온다.
정답 코드
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
let input = [];
rl.on('line', function (line) {
  input.push(line)
})
  .on('close', async function () {
  // 답안 작성
  let answer = '';
  let n = input[0];
  let arr = '0 '+ input[1]
  arr = arr.split(' ')
  answer = max_array_sum(n, arr);  
  console.log(answer)
  process.exit();
});
function max_array_sum(n, arr){
  let dp = new Array(parseInt(n)+1).fill(0)
  for(let i=1;i<=n;i++){
    let max = 0;
    for(let j=0;j<i;j++){      
      if(arr[j]*1<arr[i]*1){
        max = Math.max(dp[j], max);
      }
    }
    dp[i] = arr[i]*1 + max
  }
  return Math.max(...dp)
}
 
      
    
댓글남기기