알고리즘

백준 12015번 가장 긴 증가하는 부분 수열2 (JAVA)

박카스마시며코딩 2021. 11. 23. 09:24

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

 

12015번: 가장 긴 증가하는 부분 수열 2

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

www.acmicpc.net

 

전형적인 LIS 문제입니다. 하지만 N의 크기가 1,000,000 이기 때문에 이중for문으로 작성하면 시간초과가 날 것이라 생각합니다. 저는 DP 배열을 만들어binary search를 통해 해당 원소가 DP배열에 어디에 들어가야하는지 판단하여 위치가 DP에 들어있는 원소보다 크다면 size를 하나 늘려 최장 증가 수열의 길이를 찾았습니다. 

 

 

package BOJ;

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

public class BOJ_12015 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int n = Integer.parseInt(st.nextToken());
        int[] input = new int[n];
        int[] LIS = new int[n];
        st = new StringTokenizer(br.readLine()," ");
        for(int i = 0; i < n ; i++){
            input[i] = Integer.parseInt(st.nextToken());
        }
        int size = 0;
        for(int i = 0 ; i < n ; i++){
            int temp = Arrays.binarySearch(LIS,0,size,input[i]);
            if(temp < 0){
                temp = Math.abs(temp) - 1;
                LIS[temp] = input[i];
                if(size == temp) size++;
            }
        }
        System.out.println(size);
    }
}

'알고리즘' 카테고리의 다른 글

백준 1058번 친구 (JAVA)  (0) 2021.11.28
백준 9656번 돌 게임 2 (JAVA)  (0) 2021.11.27
백준 1194번 달이 차오른다, 가자. (JAVA)  (0) 2021.11.26
백준 1300번 K번째 수  (0) 2021.11.25
백준 12852번 1로 만들기 2 (JAVA)  (0) 2021.11.24