ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)14002 - 가장 긴 증가하는 부분 수열 4
    PS/boj 2020. 9. 18. 00:53
    import java.util.Scanner;
    
    public class boj_14002 {
        static int[] arr;
        static int[] dp;
        static int[] v;
    
        // 출력 함수 
        static void print(int p) {
            if (p == 0) return;
            print(v[p]);
            System.out.print(arr[p] + " ");
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            arr = new int[n+1];
    
            for (int i = 1; i <= n; i++) {
                arr[i] = sc.nextInt();
            }
    
            dp = new int[n+1]; // dp 
            v = new int[n+1]; // 역추적
    
            for (int i = 1; i <= n; i++) {
                dp[i] = 1;
    
                for (int j = 1; j < i; j++) {
                    if (arr[j] < arr[i] && dp[i] < dp[j]+1) {
                        dp[i] = dp[j] + 1;
                        v[i] = j; // 찾아간 값의 index를 배열에 저장
                    }
                }
            }
    
            int ans = 0;
            int index = 0;
            for (int i = 1; i <= n; i++) {
                if (ans < dp[i]) {
                    ans = dp[i];
                    index = i; // ans의 index 뽑기
                }
            }
    
            System.out.println(ans);
            print(index); // ans의 index부터 재귀 시작
            System.out.println();
    
        }
    }
    

     

    - 증가하는 부분 수열과 비슷한데 역추적을 통해 지금까지 값들을 찾아가야함

    - 나의 바로 앞에 있는 값의 인덱스를 v[] 배열에 저장 

    - 나의 값이 다음 값을 불러오는 형태이니까 재귀함수로 표현

    - ans를 뽑을때 index로 부터 print 시작

     

     

    'PS > boj' 카테고리의 다른 글

    boj)1699 - 제곱수  (0) 2020.09.18
    boj)1912 - 연속합  (0) 2020.09.18
    boj)11053 - 가장 긴 증가하는 부분 수열  (0) 2020.09.17
    boj)2193 - 이친수  (0) 2020.09.17
    boj)10844 - 쉬운 계단 수  (0) 2020.09.17
킹수빈닷컴