문제 링크
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
풀이
- 최장 증가 수열(LIS) 문제
: 원소가 n개인 배열의 일부 원소를 골라내서 만든 부분 수열 중,
각 원소가 이전 원소보다 크다는 조건을 만족하고 그 길이가 최대인 부분 수열
[백준 11053번] 가장 긴 증가하는 부분 수열 - python
문제 링크 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10..
zzion2.tistory.com
위 문제에서는 dp로 풀었었는데 시간복잡도가 O(N^2)이다.
해당 문제는 범위가 1,000,000이기 때문에 시간 초과 발생
이진 탐색을 사용한 lower bound 알고리즘으로 풀이해야 했다.
- lower bound
: 원하는 값 k 이상이 처음 나오는 위치를 찾는 알고리즘
: 시간 복잡도 O(NlogN)
# lower bound
# num과 같거나 큰 가장 작은 인덱스 구하기
def binary_search(arr, num):
start = 0
end = len(arr) -1
while start <= end :
mid = (start+end) // 2
if arr[mid] >= num :
end = mid -1
else:
start = mid + 1
return start
n = int(input())
data = list(map(int,input().split()))
max_list = []
for num in data:
idx = binary_search(max_list, num)
# 리스트의 최댓값보다 크므로 추가
if idx == len(max_list):
max_list.append(num)
# 해당 인덱스의 값을 업데이트
else:
max_list[idx] = num
print(len(max_list))
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level3] 기둥과 보 설치 - python (0) | 2022.06.07 |
---|---|
[프로그래머스][level3] 길 찾기 게임 - python (0) | 2022.05.17 |
[프로그래머스][level3] 퍼즐 조각 채우기 - python (0) | 2022.05.12 |
[백준 2294번] 동전2 - python (0) | 2022.05.06 |
[백준 11562번] 백양로 브레이크 - python (0) | 2022.05.06 |