알고리즘

[14002] 가장 긴 증가하는 부분 수열 4 - Java

주다애 2024. 11. 15. 23:02

백준 가장 긴 증가하는 부분 수열 4 (골드 IV)

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

// 가장 긴 증가하는 부분 수열 4(골드 4)
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = sc.nextInt();
		}
		List<List<Integer>> list = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			list.add(new ArrayList<>());
		}

		int[] dp = new int[n];
		dp[0] = 1;
		list.get(0).add(arr[0]);

		int len = 1;
		for (int i = 1; i < n; i++) {
			int now = arr[i];
			dp[i] = 1;
			for(int j = 0; j < i; j++) {
				if(arr[j] < now) {
					dp[i] = Math.max(dp[i], dp[j] + 1);
					len = Math.max(len, dp[i]);
				}
			}

		}
		StringBuilder sb = new StringBuilder();
		sb.append(len).append("\n");

		List<Integer> ans = new LinkedList<>();
		for(int i = n - 1; i >= 0; i--) {
			if(dp[i] == len) {
				ans.add(arr[i]);
				len -= 1;
			}
		}

		int size = ans.size();
		for(int i = size - 1; i >= 0; i--) {
			sb.append(ans.get(i) + " ");
		}
		System.out.println(sb);
	}
}

 

DP(Dynamic Programming) 문제

 

백준의 가장 긴 증가하는 부분 수열에서 좀 더 심화된 문제다.

len 변수에 가장 긴 부분 수열의 길이를 저장하고 뒤에서부터 탐색하며 해당 길이를 dp 배열의 값으로 가지고 있는 index를 ans 리스트에 추가한다.

그리고 ans 리스트를 역순으로 탐색하여 StringBuilder(sb 변수)에 넣어주면 된다.(Stack 사용 방법도 존재)