컴퓨터 공학/백준

[백준] JAVA 자바 : 가장 긴 증가하는 부분 수열 4 (14002번)

kim-dev 2024. 1. 23. 13:26
반응형


다이나믹프로그래밍에서 처음 만난 골드 등급 문제…
이거 푸려고 몇 시간을 헤맸다… 분명 가장 긴 증가하는 부분 수열은 나쁘지 않게 풀렸는데 가장 긴 수열을 출력하는 부분이 상당히 오래 걸림…

나는 어떻게 풀었냐면 가장 길어지는 부분의 인덱스를 now라는 변수에 저장해 놓고, 가장 길어질 때마다 그 때의 인덱스로 now를 갱신했다.
그리고 외부 for문을 한 바퀴 돌 때마다 dp[now]와 현재의 dp[i]를 비교해서, dp[i]가 dp[now]보다 길다면 현재까지 가장 길었던 수열(sa[now])에 지금의 수 A[i]를 덧붙이고, 그렇지 않다면 sa[i]에는 A[i]부터 시작하는 새로운 수열을 담도록 했다.

나도 글로 쓰니까 무슨 말인지 제대로 이해가 안 되는데… 머릿속으로 그린 걸 글로 쓰는게 참 힘들긴 한가보다…

 

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

public class LongestIncreasingSequence_4 {

    static int[] dp;
    static int[] A;

    public static int stoi(String str) {
        return Integer.parseInt(str);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = stoi(br.readLine());
        A = new int[N+1]; // 수열 A

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i=1; i<=N; i++) {
            A[i] = stoi(st.nextToken());
        }

        dp = new int[N+1];
        dp[1] = 1;

        String[] sa = new String[N+1];
        sa[1] = Integer.toString(A[1]);

        int now = 1;
        for (int i=2; i<=N; i++) {
            dp[i] = 1;
            for (int j=1; j<i; j++) {
                if (A[i] > A[j]) {
                    if (dp[i] <= dp[j]) {
                        dp[i] = dp[j] + 1;
                        now = j;
                    }
                }
            }
            if (dp[i] > dp[now]) {
                sa[i] = sa[now] + " " + A[i];
            } else {
                sa[i] = Integer.toString(A[i]);
            }
        }

        int max = 0;
        int max_i = 0;
        for (int i=1; i<=N; i++) {
            if (max <= dp[i]) {
                max = dp[i];
                max_i = i;
            }
        }
        System.out.println(max);
        System.out.println(sa[max_i]);
    }
}
 

로그인

 

www.acmicpc.net

 

 

작성일자: 2024-01-05