공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 백준 12015. 가장 긴 증가하는 부분수열 2(LIS)

inspirit941 2020. 7. 14. 17:20
반응형

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

수열의 크기가 백만 단위라서 N^2 의 DP로는 문제로 풀 수 없다.

Binary Search를 활용해서 O(NlogN)으로 풀어낼 수 있다.

 

자세한 풀이는 

 

최적화된 LIS(Longest Increasing Subsequence) 알고리즘과 해 찾기

LIS는 알고리즘 문제로써도, 코드 구현으로써도 너무나도 유명한 문제이지만 최적화된 해법을 찾는 과정은 문제 해결능력에 있어 큰 도움을 준다. 개인적으로 매력있게 느끼는점은 인간이 직관�

jins-dev.tistory.com

에서 확인할 수 있다.

 

import sys
import bisect
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
table = [arr[0]]
for idx in range(1, n):
# 현재까지의 부분수열 최댓값보다 더 큰 값일 경우
if arr[idx] > table[-1]:
table.append(arr[idx])
else:
# 현재 값이 부분수열의 어느 부분에 해당하는지 - left idx로 확인
insert_idx = bisect.bisect_left(table, arr[idx])
# 해당 위치의 값 업데이트
table[insert_idx] = arr[idx]
# 최장 부분수열의 길이
print(len(table))
반응형