백준 11722번: 가장 긴 감소하는 부분 수열 - javascript

1 분 소요

백준 11722번: 가장 긴 감소하는 부분 수열

문제 설명

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

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

입력

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

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

출력

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

접근

이 문제는 11053번 가장 긴 증가하는 부분 수열의 반대버전이다. 11053번은 증가했지만 이 문제는 감소하기만 하면된다.

풀이는 다음과 같다.
이번에도 역시 맨 앞에 최대 범위값보다 1 더 큰 1001을 추가해 놓는다.

원본 배열 1001 10 30 10 20 20 10
dp 0 1 - - - - -

10보다 큰 수는 1001밖에 없으므로 10에서의 최대 길이는 1

원본 배열 1001 10 30 10 20 20 10
dp 0 1 1 - - - -

30보다 큰 수 중 1001이 최대 길이를 가지고 있으므로 1

원본 배열 1001 10 30 10 20 20 10
dp 0 1 1 2 - - -

10보다 큰 수는 30과 1001인데 그 중 30이 1을 갖고있어서 최대값이므로 10의 값은 1+1

원본 배열 1001 10 30 10 20 20 10
dp 0 1 1 2 2 - -

20보다 큰 수는 30과 1001인데 그 중 30이 1을 갖고있어서 최대값이므로 20의 값은 1+1

원본 배열 1001 10 30 10 20 20 10
dp 0 1 1 2 2 2 -

20보다 큰 수는 30과 1001인데 그 중 30이 1을 갖고있어서 최대값이므로 20의 값은 1+1

원본 배열 1001 10 30 10 20 20 10
dp 0 1 1 2 2 2 3

10보다 큰 수는 30과 20, 그리고 1001인데 그 중 20이 2를 갖고있어서 최대값이므로 10의 값은 2+1

이렇게 나온 dp배열의 max값을 반환하면 정답 3이 나온다.

정답 코드

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 = '1001 '+ input[1]
  arr = arr.split(' ')
  answer = max_decrease_array(n, arr);  
  console.log(answer)
  process.exit();
});

function max_decrease_array(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] = max+1;
  }
  return Math.max(...dp)
}

댓글남기기