포스트잇

[백준] 11053번 : 가장 긴 증가하는 부분 수열 (JAVA) 본문

코딩테스트

[백준] 11053번 : 가장 긴 증가하는 부분 수열 (JAVA)

생각없는 개발자 2025. 2. 24. 19:06

1. 문제 분석

 

오름차순이 되는 부분 수열중에 가장 긴 수열의 길이를 구하면 된다. A의 크기가 1000이라 가장 긴 수열을 직접 구해도 될거같은데, 근데 알고리즘이 DP로 분류되어 있어 DP로 풀었다.

 

시간복잡도 : O(N^2) 

알고리즘 : DP

2. 문제 풀이

수열을 부분적으로 잘라서 부분수열들에서 한 항씩 추가해 가면서 최대 길이를 구한다.

  • arr[j] > arr[i] : 더 큰 값을 발견
    • dp[i] = Math.max(dp[i], dp[j]+1)
  • 더 큰값이 아닐때
    • j++

이렇게 부분수열로 쪼개 작은 수열부터 최고 길이를 구해가면 된다.

3. 코드 구현

import java.io.InputStreamReader;
import java.util.Scanner;

public class BOJ_11053 {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] num = new int[N+1];
        int[] dp = new int[N+1];

        for(int i = 1; i <= N; i++){
            num[i] = sc.nextInt();
            dp[i] = 1;
        }
        sc.close();

        int answer = 1;
        for(int i = 2; i <= N; i++){
            for(int j = 1; j < i; j++){
                if(num[j] < num[i]) dp[i] = Math.max(dp[i], dp[j]+1);
            }
            answer = Math.max(answer, dp[i]);
        }

        System.out.println(answer);

    }
}