위 포스트를 참고해서 문제를 풀었다.
우선 arr라는 리스트에 입력받은 값들을 저장한다.
그리고 res라는 리스트를 만들고 arr[0]를 저장한 뒤에,
arr에 저장된 값과 res의 마지막값을 비교하며 더 클 경우에는 res에 추가하고
작거나 같을 경우에는 res안에서 적절한 위치를 찾아서 넣어준다.
이를 끝까지 반복하면 res의 원소들이 최대길이증가수열이라는 건 보장할 수 없지만
res의 원소개수가 최대길이증가수열의 길이가 되기 때문에 이 문제에 적용할 수 있는 것이다.
n = int(input())
arr = list(map(int,input().split()))
res = [arr[0]]
for x in arr:
# res의 마지막 원소보다 크다면 바로 이어붙임
if res[-1]<x:
res.append(x)
# 그렇지 않다면 res를 이분탐색하면서 x가 들어갈 적절한 위치를 찾음
else:
start = 0
end = len(res)
while start<end:
mid = (start+end)//2
# res는 항상 정렬된 상태이기 때문에 res[mid]보다 크면 더 뒤쪽을 탐색
if res[mid]<x:
start = mid+1
else:
end = mid
res[end] = x
print(len(res))
'[BOJ] - Python' 카테고리의 다른 글
[백준] 16928 : 뱀과 사다리 게임 python (0) | 2023.09.24 |
---|---|
[백준] 1012 : 유기농 배추 python (0) | 2023.09.24 |
[백준] 2110 : 공유기 설치 python (0) | 2023.09.23 |
[백준] 10816 : 숫자 카드 2 python (1) | 2023.09.22 |
[백준] 17086 : 아기 상어 2 python (0) | 2023.09.11 |