Algorithm

[Algorithm] 99클럽 코테 스터디 22일차 TIL | 백준_가장 긴 증가하는 부분 수열(11053번)

dev_ajrqkq 2025. 2. 18. 13:33

📝문제

 

💡풀이

1) dp 배열을 만들고 1로 초기화한다.

2) 현재 수arr[i]가 이전 수arr[j]보다 크다면 증가하는 수열이므로 dp[i] = dp[j]+1이 될 수 있다.

여기서 10 20 10 30 이 있을 때 i=3라면

dp[3] = dp[1] + 1도 답이 될 수 있고 dp[3] = dp[2] + 1도 답이 될 수 있으므로

두 경우의 수 중 더 큰 값을 구해 dp[3]에 넣어줘야한다.

그러므로 해당 식이 필요하다.
dp[i] = Math.max(dp[i],dp[j]+1);

3) 이후 dp 배열에서 가장 큰 값을 찾으면 정답이다.

 

전체풀이

import java.util.*;
import java.io.*;
class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int[] dp = new int[N];
        for(int i = 0; i < N; i++){
            dp[i] = 1;
            for(int j = 0; j < i; j++){
                if(arr[i] > arr[j]){
                    dp[i] = Math.max(dp[i],dp[j]+1);
                }
            }
        }
        int max = 0;
        for(int i = 0; i < N; i++){
            max = Math.max(max, dp[i]);
        }

        System.out.println(max);
    }
}

 

🤔Review

2주 전에 개인적으로 풀었던 문제가 오늘의 문제로 나왔다. 그럼에도 풀이가 바로 생각나지 않았다;;; 멍청쓰.🫠