728x90
https://www.acmicpc.net/problem/12015
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
해당 문제는 아래의 문제의 시간복잡도를 개선 해야 하는 문제이다.
https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
기존 11053 문제풀이는 시간복잡도가 최악의 경우 O(n^2)이다.
코드에서 dp테이블의 idx를 찾는 과정은 최악의 경우 O(n) 이다. 찾는 원소가 가장 제일 끝에 있을경우
N = int(input())
li = list(map(int,input().split()))
dp = [li[0]]
for i in range(1,N):
if li[i] > dp[-1]:
dp.append(li[i])
else:
j = len(dp)-1
while j > 0:
if dp[j-1] < li[i]:
break
j -= 1
dp[j] = li[i]
print(len(dp))
파이썬에서 해당 원소를 이진탐색으로 O(logn)시간으로 찾을 수 있다. (bisect 활용)
따라서 해당 idx를 찾을때 bisect 를 활용하면 시간복잡도를 줄 일 수 있다.
from bisect import bisect_left
N = int(input())
arr = list(map(int,input().split()))
dp = [arr[0]]
for i in range(N):
if arr[i] > dp[-1]:
dp.append(arr[i])
else:
idx = bisect_left(dp, arr[i])
dp[idx] = arr[i]
print(len(dp))
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14003번 : 가장 긴 증가하는 부분 수열 5 (0) | 2023.07.16 |
---|---|
[백준] 11054번 : 가장 긴 바이토닉 부분 수열 (0) | 2023.07.16 |
[백준] 11053번 : 가장 긴 증가하는 부분수열 (0) | 2023.07.16 |
[백준] 2293번 : 동전 1 (0) | 2023.07.16 |
[백준] 11066번 : 파일 합치기 (0) | 2023.07.16 |