[PS] BOJ 14003 / 가장 긴 증가하는 부분 수열 5
문제 링크: https://www.acmicpc.net/problem/14003
Thumbnail: Photo by Lindsay Henwood (Unsplash)
놀랍게도 가장 긴 증가하는 부분 수열 4(14002)와 풀이가 동일합니다..! 왜 난이도가 다른걸까요...
풀이
가장 긴 증가하는 부분 수열 4(14002)의 풀이를 참고해주세요!
전체 코드
input = open(0).readline
N = int(input().strip())
A = list(map(int, input().strip().split()))
lis = [0 for _ in range(N)]
record = [0 for _ in range(N)]
lis[0] = A[0]
record[0] = 1
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]
record[i] = j + 1
else: # 그렇지 않다면, 이번 원소를 lis의 어디에 넣을지 이분탐색으로 결정한다.
idx = binary_search(0, j, A[i])
lis[idx] = A[i]
record[i] = idx + 1
lis_result = [0 for _ in range(j + 1)]
idx = j + 1
i = N - 1
while idx > 0 and i >= 0:
if record[i] == idx:
lis_result[j + 1 - idx] = A[i]
idx -= 1
i -= 1
print(j + 1)
print(*lis_result[::-1])solution.py