김찬진의 개발 블로그

[23/05/12] B11053 본문

1일1알고/Java Algorithm

[23/05/12] B11053

kim chan jin 2023. 5. 12. 15:02
package baekjoon;

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

public class B11053 {
    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+1];
        int dp[] = new int[N+1];

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i=1; i<=N; i++) {
            arr[i] = Integer.parseInt(st.nextToken()); // arr 채우기
            dp[i] = 1; // dp 채우기
        }

        int max = 1;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j < i; j++) {
                if (arr[i] > arr[j]) {
                    dp[i] = Math.max(dp[i], dp[j]+1); // 이전 원소들 중 가장 큰 dp값 + 1
                }
            }
            max = Math.max(max, dp[i]);  //LIS 길이 구하기
        }
        System.out.print(max);

    }
}

 

느낀점

DP가 별건 아니다.

배열에 저장하면서 꺼내쓰는 것이다!

dp[ i ] = 1 로, dp 배열을 1로 채우는 이유

부분수열의 최소는 무조건 1이기 때문에 최초의 dp 배열은 1로 채워진다.

 

Math.max(dp[ i ]+1, dp[ j ]) 가 아니라

Math.max(dp[ i ], dp[ j ]+1) 인 이유

if(arr[ i ] > arr[ j ]) 라는 조건문에 걸리면

자신 이전의 특정값보다 1 증가된 값을 dp[ i ]에 채우는 것이다.

예를 들어, if(arr[ i ] > arr[ j ]) 라면

만약 i = 5 일 때

j = 1, 2, 3, 4 값과 하나하나 비교하여 dp[ j ] + 1 으로 dp[ i ]을 최신화한다

 

 

 

'1일1알고 > Java Algorithm' 카테고리의 다른 글

[23/09/10] B26042  (0) 2023.09.10
[23/09/10] B28279  (0) 2023.09.10
[23/05/12] B2839_DP  (0) 2023.05.12
[23/05/04] B2839  (1) 2023.05.04
[23/05/04] B5397  (0) 2023.05.04
Comments