코딩테스트/⚪백준_ 단계별로 풀어보기

[DP][JAVA] 11053번 가장 긴 증가하는 부분 수열

1son 2023. 5. 23. 06:52
문제

수열 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의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public 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];
        int[] dp = new int[N];
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        dp[0] = 1;
        for (int i = 1; i < N; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (arr[j] < arr[i] && dp[i] < dp[j] + 1) {
                    dp[i] = dp[j] + 1;
                }
            }
        }
        
        int max = dp[0];
        for (int i = 1; i < N; i++) {
            if (max < dp[i]) {
                max = dp[i];
            }
        }
        
        System.out.println(max);
    }
}

이 코드는 가장 긴 증가하는 부분 수열(LIS, Longest Increasing Subsequence)을 구하는 문제입니다. BufferedReader를 사용하여 입력을 처리하고, dp 배열을 사용하여 부분 수열의 길이를 저장하고 업데이트합니다. 마지막으로 dp 배열에서 최댓값을 찾아 출력합니다.

 

import java.io.*;
import java.util.*;

public 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];//숫자 저장
        int dp[] = new int[n];//최댓값 저장
        
        //st사용해야 하는거 까먹음
        StringTokenizer st = new StringTokenizer(br.readLine());
       
        for(int i=0;i<n;i++){
            arr[i]=Integer.parseInt(st.nextToken());
        }
        
        dp[0]=1;
        for(int i=1;i<n;i++){
            dp[i]=1;
            //j는 i보다 작을 때 까지 
            for(int j=0;j<i;j++){
                if(arr[j]<arr[i] && dp[i]<dp[j]+1){
                    dp[i]=dp[j]+1;
                }
            }
        }
        int max=dp[0];
        for(int i=1;i<n;i++){
            if(max<dp[i]){
                max=dp[i];
            }
        }
        System.out.println(max);
        
}
}