[백준] 12015번 가장 긴 증가하는 부분 수열2 (JAVA, 이분탐색 binary search)
728x90
반응형
부분 수열1은 O(n*n)이 가능해서 dp (이중 포문)으로 많이 풀고 이 문제부터는 n이 커지므로 이분탐색*for문
O(nlogn)으로 풀 수 있는 이분탐색이 필요하다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n;
static int[] num;
static ArrayList<Integer> arr=new ArrayList<>();
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
num=new int[n+1];
for (int i = 1; i <= n; i++) {
num[i]=sc.nextInt();
}
arr.add(0);
for (int i = 1; i <= n; i++) {
if(num[i]>arr.get(arr.size()-1)) {// 더 큰수는 뒤에 붙는다.
arr.add(num[i]);
}else {// 작거나 같은 수는 앞에 붙음 더 작거나 같은 위치를 binary로 찾는다.
int idx=binary(num[i]);
arr.set(idx, num[i]);//들어갈 수 있는 위치를 갱신해준다.
}
}
System.out.println(arr.size()-1);
}
private static int binary(int num) {//a 새로운 수 ,b 기존 수
int left=0;
int right=arr.size()-1;
while(left<right) {
int mid=(left+right)/2;
if(arr.get(mid)>=num) {//num이 들어갈 자리. 들어갈 수 있는 자리를 찾으면
// 더 작은 곳도 혹시 되나? 하고 확인해준다.
right=mid;
}else{
left=mid+1;
}
}
return right;
}
}
0
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 14502번 연구소 (bfs, 구현) (0) | 2021.03.26 |
---|---|
[백준] 9205번 맥주 마시면서 걸어가기 (java, 플로이드 와샬) (0) | 2021.03.25 |
[백준] 2636. 치즈 (bfs, java) (0) | 2021.03.24 |
[백준] 1600번 말이 되고픈 원숭이 (java, bfs) (0) | 2021.03.24 |
[백준] 17086번. 아기 상어2 (bfs, java) (0) | 2021.03.24 |
TAGS.