일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Redux
- 프로그래머스
- react
- vscode
- DP
- Graph
- 백준
- CS
- VIM
- frontend
- network
- 알고리즘
- Algorithm
- Database
- git
- Javascript
- 안드로이드
- 리트코드
- Data Structure
- TypeScript
- LeetCode
- DFS
- 자바
- BFS
- 동적 계획법
- java
- 다이나믹 프로그래밍
- db
- 그레이들
- Python
Archives
- Today
- Total
늘 겸손하게
백준 12015 - 가장 긴 증가하는 부분 수열 2 (Java) 본문
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 |
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 13904 과제 (Java) (0) | 2023.08.01 |
---|---|
백준 2565번 전깃줄 (Java) (0) | 2023.07.26 |
백준 9095 - 1, 2, 3 더하기 ( Java ) (0) | 2022.05.24 |
백준 1003 - 피보나치 함수 ( Java ) (0) | 2022.05.23 |
백준 14502 - 연구소 ( Java ) (0) | 2022.05.19 |