일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Graph
- 백준
- Python
- Data Structure
- 프로그래머스
- 리트코드
- react
- Database
- Redux
- 그레이들
- Javascript
- java
- 안드로이드
- VIM
- db
- LeetCode
- CS
- DP
- vscode
- 다이나믹 프로그래밍
- TypeScript
- frontend
- BFS
- git
- 알고리즘
- network
- 자바
- DFS
- Algorithm
- 동적 계획법
Archives
- Today
- Total
늘 겸손하게
백준 12015 ( Java ) 본문
가장 긴 증가하는 부분 수열 2
가장 긴 증가하는 부분 수열을 구하는 문제이다.
문제 풀이
가장 긴 증가하는 부분 수열을 직접 만든 뒤, 길이를 출력하면 된다. 그러면 가장 긴 증가하는 부분 수열은 어떻게 만들까?
수열 A의 첫 번째 원소부터 마지막 원소까지 참조해가면서 참조한 원소가 만들고 있던 부분 수열의 마지막 원소보다 크다면 부분 수열의 꼬리에 추가, 작거나 같다면 부분 수열에서 알맞은 위치에 덮어쓰면 된다. 여기서 알맞은 위치를 찾는데 이분 탐색 알고리즘을 적용한다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
ArrayList<Integer> arr = new ArrayList<>();
arr.add(0);
for (int i = 0 ; i < N ; i++) {
int temp = sc.nextInt();
if (arr.get(arr.size() - 1) < temp) {
arr.add(temp);
}
else {
int left = 1;
int 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 |
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 18870 ( C++ ) (0) | 2021.08.10 |
---|---|
백준 3273 ( C++ ) (0) | 2021.07.24 |
문제 2805 ( Java ) (0) | 2021.07.21 |
백준 - 2110 ( Java ) - 매개변수 탐색 (0) | 2021.07.20 |
백준 1654 ( C++ ) (0) | 2021.07.20 |