알고리즘/문제풀이
[백준/BOJ] 11053 가장 긴 증가하는 부분 수열 - JAVA
LIRI
2024. 8. 22. 22:32
백준 BOJ 11053 가장 긴 증가하는 부분 수열 - JAVA - 실버2
문제
https://www.acmicpc.net/problem/11053
문제 분석
조건
- 첫째 줄에 수열의 크기, 둘째 줄에 수열이 주어짐
- 가장 긴 증가하는 부분 수열의 길이 출력
풀이방법
- LIS 알고리즘을 활용하여 풀이
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
int[] lis = new int[N];
int top = 0;
for (int num : A) {
if (top == 0 || lis[top - 1] < num) {
lis[top++] = num;
continue;
}
lis[binarySearch(lis, top, num)] = num;
}
System.out.println(top);
}
private static int binarySearch(int[] lis, int top, int num) {
int start = 0;
int mid = 0;
int end = top;
while (start <= end) {
mid = (start + end) / 2;
if (lis[mid] == num) {
return mid;
} else if (lis[mid] < num) {
start = mid + 1;
} else {
end = mid - 1;
}
}
if (lis[mid] < num) {
return mid + 1;
} else {
return mid;
}
}
}
결과
728x90