늘 겸손하게

백준 12015 - 가장 긴 증가하는 부분 수열 2 (Java) 본문

코딩 문제/백준

백준 12015 - 가장 긴 증가하는 부분 수열 2 (Java)

besforyou999 2022. 5. 28. 17:07

made by : besforyou

 

 

문제 풀이

 

수열의 크기가 1 <= N <= 1,000,000 이므로 시간복잡도가 N^2 이상인 알고리즘은 사용할 수가 없다.

그러므로 이분 탐색을 활용하여 가장 긴 증가하는 부분 수열을 직접 만들자.

 

  1. 수열을 읽어들이면서 부분수열의 마지막 원소와 비교한다.
  2. 마지막 원소보다 큰 원소는 바로 정답 배열 마지막에 추가
  3. 그렇지 않은 원소는 부분수열에 적절한 위치에 배치한다.
  4. 생성한 가장 긴 증가하는 부분 수열의 길이를 반환

 

코드

 

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