티스토리 뷰
https://www.acmicpc.net/problem/12015
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
코드
import sys
from bisect import bisect_left
a = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
dp = [0]
for i in arr:
if dp[-1] < i:
dp.append(i)
else:
dp[bisect_left(dp, i)] = i
sys.stdout.write(str(len(dp) - 1))
풀이
bisect_left는 리스트에서 i라는 원소가 들어갈 가장 왼쪽 위치를 반환해주는 함수이다. 가장 마지막 원소가 현재 원소보다 작으면 뒤로 이어서 붙여주면 되고, 아닌 경우에는 이진탐색으로 해당 인덱스의 원소를 교체해주면 된다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 1744 파이썬 - 수 묶기 (0) | 2022.08.31 |
---|---|
백준 1541 파이썬 - 잃어버린 괄호 (0) | 2022.08.23 |
백준 2109 파이썬 - 순회강연 (0) | 2022.08.14 |
백준 1202 파이썬 - 보석 도둑 (0) | 2022.06.30 |
백준 1285 파이썬 - 동전 뒤집기 (0) | 2022.06.29 |