solution
1. LIS(최장 증가 수열) 이용
# 1365, 꼬인 전깃줄
import sys
# 해당 숫자 이상의 수 중 가장 가까운 인덱스를 리턴하는 함수 ( 정렬이 되어있을 때만 가능 )
def lower_bound(s, e, v):
while s < e:
m = (s + e) // 2
if res[m] < v:
s = m + 1
else:
e = m
return e
n = int(sys.stdin.readline())
line = list(map(int, sys.stdin.readline().split()))
res = []
for i in range(n):
if i == 0: # 첫 번째 수는 res에 추가
res.append(line[0])
if res[-1] < line[i]: # line[i]가 res의 마지막 요소보다 크면 마지막에 추가
res.append(line[i])
else: # line[i]가 res의 마지막 요소보다 작으면 lower bound 하여 나온 index위치의 값과 교환
tmp = lower_bound(0, len(res), line[i])
res[tmp] = line[i]
print(n - len(res))
40256KB
224ms
'알고리즘 > 이분 탐색' 카테고리의 다른 글
자바 | 백준 | 1920 | 수 찾기 (0) | 2021.02.27 |
---|---|
파이썬 | 백준 | 2352 | 반도체 설계 (0) | 2020.09.02 |