본문 바로가기

Language/JAVA

[JAVA][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열2 - 컴도리돌이

728x90
 

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

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

www.acmicpc.net


 

해당 문제는 이분 탐색으로 해결했습니다.

주어진 N만큼 반복문을 시행합니다.

arr의 맨 뒤 값보다 현재 주어진 값보다 작을 경우

arr의 맨 뒤에 해당 값으로 업데이트 해줍니다.

 

그 반대일 경우

이분 탐색으로 주어진 값의 인덱스를 찾아줍니다.

 

파이썬 풀이

 

[Python][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열 2 - 컴도리돌이

풀이 과정 해당 문제는 bisect 라이브러리를 사용해서 해결하였다. bisect에 대해서는 아래 링크를 참조하면 좋다. [Python] bisect - 컴도리돌이 알고리즘 문제를 해결하다가 다른 분의 블로그에서 제

comdolidol-i.tistory.com


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int N;
    static int [] arr;
    static int ansIdx = 1;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        arr = new int[N];
        arr[0] = Integer.parseInt(st.nextToken());
        for(int i=1; i<N ; i++){
            int value = Integer.parseInt(st.nextToken());
            if(arr[ansIdx-1] < value) {
                ansIdx ++;
                arr[ansIdx-1] = value;
            }
            else{
                int left = 0, right =ansIdx;
                while(left < right){
                    int mid = (left + right)/ 2;
                    if(arr[mid] < value) left = mid +1 ;
                    else right = mid ;
                }
                arr[left] = value;
            }
        }
        System.out.println(ansIdx);
    }
}