[백준][11053번] 가장 긴 증가하는 부분 수열1

Updated:

문제 URLPermalink

https://www.acmicpc.net/problem/11053 boj11053

나의 풀이Permalink

import java.io.*;
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[] a = new int[n + 1]; // 수열
        int[] d = new int[n + 1]; // i번째까지 가장긴 증가하는 부분수열의 길이
        StringTokenizer str = new StringTokenizer(br.readLine());
        for (int i = 1; i <= n; i++) {
            a[i] = Integer.parseInt(str.nextToken());
            for (int j = 1; j <= i - 1; j++) {
                if (d[i] < d[j] && a[j] < a[i])
                    d[i] = d[j];
            }
            d[i] += 1;
        }

        int answer = 0;
        for (int i = 1; i <= n; i++) {
            if (answer < d[i])
                answer = d[i];
        }
        System.out.println(answer);
    }
}

다른 풀이Permalink

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i=0; i<n; i++) {
            a[i] = sc.nextInt();
        }
        int[] d = new int[n];
        for (int i=0; i<n; i++) {
            d[i] = 1;
            for (int j=0; j<i; j++) {
                if (a[j] < a[i] && d[i] < d[j]+1) {
                    d[i] = d[j]+1;
                }
            }
        }
        int ans = d[0];
        for (int i=0; i<n; i++) {
            if (ans < d[i]) {
                ans = d[i];
            }
        }
        System.out.println(ans);
    }
}

느낀점Permalink

동적계획법 을 이용한 문제다.

끝내 풀지 못하고 백준 강의를 통해 핵심개념을 파악하고 문제를 풀어봤다.

  • D[i] = A[1], …. , A[i]까지 수열이 있을때 A[i]을 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이

  • A[j], A[i] (j<i) 수열이 있으면 D[i] = max(D[j]) +1

  • 시간복잡도 : O(N2)

  • D[n]이 문제의 정답이 아닐 수도 있다.

Leave a comment