[PS] BOJ 12738 / 가장 긴 증가하는 부분 수열 3

[PS] BOJ 12738 / 가장 긴 증가하는 부분 수열 3
문제 링크: https://www.acmicpc.net/problem/12738
Thumbnail: Photo by Ruffa Jane Reyes (Unsplash)

놀랍게도 어제 풀었던 문제(12015)와 같은 풀이로 풀 수 있습니다! 수의 범위가 음수까지 포함되어 뭔가 더 고쳐야 할지 고민했던게 무색하게 그냥 풀려버렸습니다...

풀이

12015 (가장 긴 증가하는 부분 수열 2)의 풀이를 참고해 주세요~

전체 코드

input = open(0).readline
N = int(input().strip())
A = list(map(int, input().strip().split()))
lis = [0 for _ in range(N)]
lis[0] = A[0]

def binary_search(left, right, value):
    while left < right:
        mid = (left + right) // 2
        if lis[mid] < value:
            left = mid + 1
        else:
            right = mid
    return right

j = 0
for i in range(1, N):
    if A[i] > lis[j]: # 현재 LIS의 마지막 원소보다 이번 원소가 더 크다면
        j += 1
        lis[j] = A[i]
    else:   # 그렇지 않다면, 이번 원소를 lis의 어디에 넣을지 이분탐색으로 결정한다.
        idx = binary_search(0, j, A[i])
        lis[idx] = A[i]


print(j + 1)

solution.py