def binary_search(num): s = 1 e = len(lis)-1 while s <= e: m = (s + e) // 2 if lis[m] == num: return m elif lis[m] < num: s = m + 1 else: e = m - 1 return s # num은 lis 안의 숫자 중, num보다 한 단계 큰 숫자의 자리에 들어간다. n = int(input()) # 수열의 크기 arr = list(map(int, input().split())) # 수열 lis = [0] # 증가하는 수열을 담는 리스트 (인덱스 에러 때문에 0으로 채워준다.) for num in arr: # 입력받은 수열의 숫자들을 하나씩 가져온다. if lis[-1] < num: # lis의 마지막 숫자는 lis에서 가장 큰 숫자이므로, lis 안의 가장 큰 숫자보다 num이 크다면 lis.append(num) # 증가하는 것이므로 추가해준다. else: lis[binary_search(num)] = num # 그렇지 않다면 이진탐색으로 lis에 들어갈 자리를 정해준다. print(len(lis)-1) # 맨 처음 0을 담고 시작했으므로, lis의 길이 -1해준다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 12865. 평범한 배낭 (0) | 2021.12.16 |
---|---|
[Python] 1806. 부분 합 (0) | 2021.12.16 |
[Python] 2776. 암기왕 (0) | 2021.10.20 |
[Python] 2589. 보물섬 (0) | 2021.10.19 |
[Python] 9205. 맥주마시면서 걸어가기 (0) | 2021.10.19 |