(파이썬)
N = int(input())
arr = list(map(int,input().split()))
L = [arr[0]]
for i in range(1,N):
if arr[i] > L[-1]:
L.append(arr[i])
continue
left = 0
right = len(L) - 1
while left<right:
mid = (left+right)//2
if L[mid] < arr[i]:
left = mid + 1
else:
right = mid
L[right] = arr[i]
print(len(L))
print(*L)
N: 주어지는 배열의 길이
arr: 주어지는 배열
L에 LIS를 담는다고할떄
주어진 arr을 1번째부터 탐색하면서 만약 L의 마지막보다 arr[i] 가 크다면 -> L에다가 arr[i]추가
만약 아니라면 -> 갈아끼울 것을 이분탐색으로 찾음, arr[i]가 L의 원소보다 최초로 커지는 곳을 찾고 기존에 있던 것과 갈이끼움
이렇게 해서 LIS를 구할 수 있다고 알고있는데 14003이 자꾸 틀렸다고 나오네요
이 문제에 특이한 조건도 없는데 제가 잘못알고 있는건가요
작성자고 이분탐색lis공부중인데 출력도 이상하게 나와요
Dp로 푸는건 한계가 있어서ㅠㅠ
길이를 구하는 것 까지는 맞지만 역추적은 좀 생각을 해야함 - dc App
L에 결국 arr의 원소를 조건에 맞게 저장하는건데 역추적한 것과 어떤 차이가 있을까요?
L[i-1]이 길이 i인 부분증가수열의 끝값 중 가장 작은 값이기 때문에 L 배열이 LIS 자체를 담고 있지 않아요
아 감사합니다~!
예시로 2 3 1 같은 input이 들어오면 L에는 1 3이 들어갑니다