쫑쫑이의 블로그

백준 12738 가장 긴 증가하는 부분 수열 3 Java [LIS] 본문

알고리즘/백준

백준 12738 가장 긴 증가하는 부분 수열 3 Java [LIS]

쫑쫑2 2022. 10. 22. 09:58

https://www.acmicpc.net/problem/12738

 

12738번: 가장 긴 증가하는 부분 수열 3

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

www.acmicpc.net

 

 

이전에 푼 가장 긴 증가하는 부분 수열 2 문제보다 수열 A를 이루는 숫자가 범위가 더 크고, 음수도 들어온다

푸는 방법은 다르지 않지만 이번에는 Arrays.binarySearch 메서드를 사용해서 풀이를 해봤다

Arrays.binarySearch 메서드 값은 일치하는 숫자가 있으면 해당 인덱스를 반환하고,

일치하는 숫자가 없으면 절대값으로 바꾸고 -1 해주면 들어갈 인덱스값이 된다

 

import java.io.*;
import java.util.*;

public class Main {
    static final int MAX_N = 1000000;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = Arrays.stream(br.readLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();
        int[] D = new int[MAX_N];
        D[0] = arr[0];
        int size = 1;
        for (int i = 1; i < N; i++) {
            int index = Arrays.binarySearch(D, 0, size, arr[i]);
            index = index >= 0 ? index : Math.abs(index) - 1;
            D[index] = arr[i];
            if (index == size) size++;
        }
        System.out.println(size);
    }
}

 

문제접근법은 이전에 푼 것과 같다

https://jjong2.tistory.com/31

 

백준 12015 가장 긴 증가하는 부분 수열 2 Java

https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1..

jjong2.tistory.com