in.add()

[14003] 가장 긴 증가하는 부분 수열 5 본문

Algorithm/BOJ

[14003] 가장 긴 증가하는 부분 수열 5

idan 2021. 9. 16. 21:44

문제 링크 : https://www.acmicpc.net/problem/14003

 

14003번: 가장 긴 증가하는 부분 수열 5

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

www.acmicpc.net

 

문제 해결 방법

14002번과 같은 문제이지만 입력 크기가 훨씬 커서 이진 탐색을 이용한 LIS를 구현했다.

 

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int[] arr = new int[N];
        int[] length = new int[N];
        ArrayList<Integer> list = new ArrayList<>();
        list.add(Integer.MIN_VALUE);

        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i = 0; i < N; i++) {
            int num = arr[i];
            if (num > list.get(list.size() - 1)) {
                list.add(num);
                length[i] = list.size() - 1;
            } else {
                int left = 0;
                int right = list.size() - 1;

                while (left < right) {
                    int mid = (left + right) / 2;
                    if (list.get(mid) >= num) {
                        right = mid;
                    } else {
                        left = mid + 1;
                    }
                }
                list.set(right, num);
                length[i] = right;
            }
        }

        int idx = list.size() - 1;
        Deque<Integer> q = new LinkedList<>();
        for (int i = N - 1; i >= 0; i--) {
            if (idx == length[i]) {
                q.push(arr[i]);
                idx--;
            }
        }

        System.out.println((list.size() - 1));
        while (!q.isEmpty()) {
            System.out.print(q.pop() + " ");
        }
    }

}

'Algorithm > BOJ' 카테고리의 다른 글

[2667] 단지 번호 붙이기  (0) 2021.09.22
[17472] 다리 만들기 2  (0) 2021.09.18
[14002] 가장 긴 증가하는 부분 수열 4  (0) 2021.09.16
[1149] RGB거리  (0) 2021.09.14
[2116] 주사위 쌓기  (0) 2021.09.11
Comments