알고리즘/문제풀이

[백준/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