https://www.acmicpc.net/problem/2352
2352번: 반도체 설계
첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주
www.acmicpc.net
저는 해당 문제를 LIS를 이용하여 문제를 해결하였습니다.
함수 lis를 이중 for문을 통해 구현하였습니다. 이때 시간복잡도는 O(n^2) 이 됩니다.
함수 listBinarySearch는 이분탐색을 통해 구현하였습니다. 이때는 O(nlog(n))이 됩니다.
package BOJ.ETC;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2352 {
private static int lis(int[] input , int n){
int[] lis = new int[n];
Arrays.fill(lis,1);
int result = 1;
for(int i = 0 ; i < n ; i++){
for(int j = i + 1 ; j < n ; j++){
if(input[i] < input[j] && lis[i] + 1 > lis[j]){
lis[j] = lis[i] + 1;
result = Math.max(result,lis[j]);
}
}
}
return result;
}
private static int lisBinarySearch(int[] input , int n){
int[] dp = new int[n];
int size = 0;
for(int i = 0 ; i < n ; i++){
int index = Arrays.binarySearch(dp,0,size,input[i]);
if(index < 0){
index = -index - 1;
dp[index] = input[i];
if(size < index + 1){
size = index + 1;
}
}
}
return size;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int[] input = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++){
input[i] = stoi.apply(st.nextToken());
}
System.out.println(lisBinarySearch(input,n));
}
}
'알고리즘' 카테고리의 다른 글
백준 2217번 로프 (JAVA) (0) | 2022.02.13 |
---|---|
백준 1655번 가운데를 말해요 (JAVA) (0) | 2022.02.12 |
백준 13904번 과제 (JAVA) (0) | 2022.02.10 |
백준 16938번 캠프 준비 (JAVA) (0) | 2022.02.09 |
백준 11441번 합 구하기 (JAVA) (0) | 2022.02.08 |