반응형
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
에서 확인할 수 있다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
반응형
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 백준 16918. 봄버맨 (0) | 2020.07.20 |
---|---|
[Python] SWExpertAcademy. 수영장 (0) | 2020.07.15 |
[Python] 백준 2644. 촌수계산 (0) | 2020.07.13 |
[Python] 백준 5014. 스타트링크 (0) | 2020.07.09 |
[Python] 백준 1244. 스위치 켜고 끄기 (0) | 2020.07.08 |