소스코드

이분탐색

import sys
input = sys.stdin.readline

N = int(input().strip())
A = list(map(int, input().strip().split()))

def binary_search(list, target):
    start = 0
    end = len(list)

    while start < end:
        mid = (start + end) // 2

        if list[mid] < target:
            start = mid + 1
        else:
            end = mid

    return start # 삽입할 인덱스

def solve(A):
    list = []
    
    for value in A:
        index = binary_search(list, value)
        if index == len(list):
            list.append(value)
        else:
            list[index] = value

    return len(list)

print(solve(A))

DP

import sys
input = sys.stdin.readline

N = int(input().strip())
A = list(map(int, input().strip().split()))

lengths = [1] * N # DP 테이블 : A[i]를 마지막 원소로 하는 가장 긴 증가하는 부분 수열의 최대길이
for i in range(N):
	for j in range(i):
		if A[j] < A[i]:
			lengths[i] = max(lengths[i], lengths[j] + 1)

print(max(lengths))

풀이

이분탐색

DP