접근

가장 긴 증가하는 수열은 동적계획법에서 나왔던 문제이고, 그때도 굉장히 오래 고민했던 기억이 난다.

2021.03.28 - [코딩/백준 (Python)] - 백준 11053번: 가장 긴 증가하는 부분 수열 (Python)

 

백준 11053번: 가장 긴 증가하는 부분 수열 (Python)

접근 수열 A 0번 요소부터 i - 1번 요소 중 A[i]보다 작은 수만 탐색하면서, 해당 요소가 가지고 있는 dp값 중 최대값을 찾는다. dp[i]에 해당 최대값보다 1 큰 값을 입력해주고 다음 수로 넘어가 계산

ca.ramel.be

이번 문제는 그와 같은 문제이긴 하지만 입력되는 수열의 크기가 훨씬 커서 동적계획법으로는 시간안에 풀 수 없다...고 하여 이분탐색 알고리즘을 이용해야 하는데, 사실 스스로 풀지 못하고 풀이를 보고 코드를 짜게 되었다. 가장 긴 증가하는 부분 수열 알고리즘에 대해 아래 링크에서 도움을 많이 받았다. 링크에 아주 이해하기 쉽게 설명되어 있다.

최장 증가 부분 수열

 

최장 증가 부분 수열 - 나무위키

어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열이라 한다.

namu.wiki

코드

import sys

n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
dp = [0]

for i in range(n):
    low = 0
    high = len(dp) - 1

    while low <= high:
        mid = (low + high) // 2
        if dp[mid] < a[i]:
            low = mid + 1
        else:
            high = mid - 1

    if low >= len(dp):
        dp.append(a[i])
    else:
        dp[low] = a[i]

print(len(dp) - 1)

더 생각해 볼 것?

이분탐색 알고리즘임을 알고있어도 이 문제는 어떻게 푸는지 전혀 감을 잡지 못했다. 다음번에 비슷한 문제를 만나더라도 헤메지 않도록 숙지해야겠다.

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기