BOJ 14002. 가장 긴 증가하는 부분수열 4(LIS)

1 minute read

BOJ 14002. 가장 긴 증가하는 부분수열 4 (LIS)

image

풀이

beomseok95.tistory.com/355 위 문제와 같은 문제이지만 LIS의 길이뿐 아니라 모든 원소를 출력해야한다.
위 LIS 문제와 같이 푸는데, 역추적을 위한 배열을 만들어 LIS에 연결되는 인덱스를 저장한다.

image

import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;

class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        StringBuilder answer = new StringBuilder();
        int n = sc.nextInt();
        int[] arr = new int[n];
        int[] d = new int[n]; // 길이를 담을 배열
        int[] v = new int[n]; // 경로를 추적할 인덱스를 담을 배열
        int max = -1;
        int index = -1;

        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
            d[i] = 1;
            v[i] = -1;
            for (int j = 0; j < i; j++) {
                if (arr[i] > arr[j] && d[i] < d[j] + 1) {
                    d[i] = d[j] + 1;
                    v[i] = j;
                }
            }

            if (max < d[i]) {
                max = d[i];
                index = i;
            }
        }
        answer.append(max).append("\n");

        Stack<Integer> stack = new Stack<Integer>();
        while (index != -1) {
            stack.push(arr[index]);
            index = v[index];
        }

        while (!stack.isEmpty()) {
            answer.append(stack.pop()).append(" ");
        }

        sc.close();
        System.out.println(answer);
    }
}
import java.util.*

fun main() {
    val n = readLine()!!.toInt()
    val arr = readLine()!!.split(" ").map { it.toInt() }
    val d = IntArray(n) { 1 } // 길이를 담을 배열
    val v = IntArray(n) { -1 } // 경로를 추적할 인덱스를 담을 배열

    for (i in 0 until n) {
        for (j in 0 until i) {
            if (arr[i] > arr[j] && d[i] < d[j] + 1) {
                d[i] = d[j] + 1
                v[i] = j
            }
        }
    }
    val maxLength = d.maxOf { it }
    var index = d.indexOf(maxLength)
    println(maxLength)

    val stack = Stack<Int>()
    while (index != -1) {
        stack.push(arr[index])
        index = v[index]
    }

    while (!stack.isEmpty()) {
        print("${stack.pop()} ")
    }
}

풀이소스

github.com/beomjo/algorithm-study/commit/2927f0207bb85c7dce70681a1aecef2d41903a2d