코딩 문제/백준
백준 12015 - 가장 긴 증가하는 부분 수열 2 (Java)
besforyou999
2022. 5. 28. 17:07
made by : besforyou
문제 풀이
수열의 크기가 1 <= N <= 1,000,000 이므로 시간복잡도가 N^2 이상인 알고리즘은 사용할 수가 없다.
그러므로 이분 탐색을 활용하여 가장 긴 증가하는 부분 수열을 직접 만들자.
- 수열을 읽어들이면서 부분수열의 마지막 원소와 비교한다.
- 마지막 원소보다 큰 원소는 바로 정답 배열 마지막에 추가
- 그렇지 않은 원소는 부분수열에 적절한 위치에 배치한다.
- 생성한 가장 긴 증가하는 부분 수열의 길이를 반환
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayList<Integer> arr = new ArrayList<>();
arr.add(0);
for (int i = 0 ; i < N ; i++) {
int temp = Integer.parseInt(st.nextToken());
if (arr.get(arr.size() - 1) < temp) {
arr.add(temp);
} else {
int left = 1, right = arr.size() - 1;
while (left < right) {
int mid = (left + right) / 2;
if (arr.get(mid) < temp) {
left = mid + 1;
} else
right = mid;
}
arr.set(right, temp);
}
}
System.out.print(arr.size() - 1);
}
}
|
cs |
결과
