본문 바로가기

개발/algorithm

[백준 12015번] 가장 긴 증가하는 부분 수열2 - python

문제 링크

 

12015번: 가장 긴 증가하는 부분 수열 2

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net

 

풀이

- 최장 증가 수열(LIS) 문제

: 원소가 n개인 배열의 일부 원소를 골라내서 만든 부분 수열 중,

각 원소가 이전 원소보다 크다는 조건을 만족하고 그 길이가 최대인 부분 수열 

https://zzion2.tistory.com/81

 

[백준 11053번] 가장 긴 증가하는 부분 수열 - python

문제 링크 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10..

zzion2.tistory.com

위 문제에서는 dp로 풀었었는데 시간복잡도가 O(N^2)이다.

해당 문제는 범위가 1,000,000이기 때문에 시간 초과 발생 

이진 탐색을 사용한 lower bound 알고리즘으로 풀이해야 했다. 

 

- lower bound

: 원하는 값 k 이상이 처음 나오는 위치를 찾는 알고리즘 

: 시간 복잡도 O(NlogN)

# lower bound 
# num과 같거나 큰 가장 작은 인덱스 구하기 
def binary_search(arr, num):
    start = 0 
    end = len(arr) -1 
    
    while start <= end :
        mid = (start+end) // 2
        
        if arr[mid] >= num :
            end = mid -1 
        else:
            start = mid + 1 
    
    return start 
    
n = int(input())
data = list(map(int,input().split()))

max_list = []

for num in data:
    idx = binary_search(max_list, num)
    
    # 리스트의 최댓값보다 크므로 추가 
    if idx == len(max_list):
        max_list.append(num)
    # 해당 인덱스의 값을 업데이트 
    else:
        max_list[idx] = num
        
print(len(max_list))