본문 바로가기

LIS

(2)
[백준/알고리즘] 14003번 가장 긴 증가하는 부분수열 5 (골드 1) BOJ 14003번 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열의 길이와 수열을 출력하시오. 풀이 알고리즘 : LIS 알고리즘, DP 앞서 LIS의 길이만 출력하는 문제와 다르게, 그 수열을 출력하는 문제이다. LIS를 lower_bound를 이용해 구하면, 그때의 벡터에 들어있는 값은 단순히 길이를 재기위한 값이고, LIS가 아니다.그래서, DP를 통해 해당 수열이 LIS에서 몇번째 인덱스에 위치했었는지를 저장하고, 나중에 역으로 확인해서 출력하면 된다. 예를들면 1, 3, 2, 4, 5 라는 수열이 있다고 하면,i = 0일때 arr[i] = 1이고, lis = []이므로, lis = [1] 이고 따라서 1은 0번째 인덱스에 위치한다고 저장한다.i = 1일때 arr[i] = 3이고, lis =..
[백준/알고리즘] 12738번 가장 긴 증가하는 부분 수열 3 (골드 2) BOJ 12738번 수열 A가 주어졌을 때, 가장 긴 증가하는 부분수열의 길이를 출력하시오. 풀이 알고리즘 : 이분탐색(lower_bound), LIS 알고리즘 일단 이 문제는 11053번, 12015번 문제인 다른 가장 긴 증가하는 부분수열 문제와 비슷하지만 범위가 더 크다. 즉 현재 문제를 풀 수 있다면 앞선 두 문제는 같은 방법으로 풀 수 있다. 먼저 증가하는 부분수열은, i < j이고, ai < aj인 원소들의 집합이다. 이런 문제를 푸는 방법은 여러가지가 있는데, 대표적으로 DP와 이번에 사용할 방법인 이분탐색이다.이분탐색을 사용하는 이유는 속도가 빠르기 때문이다.모든 원소에 대해서(N번) 각각의 원소가 들어갈 위치(lower_bound)를 찾아서 넣는다.(logN) 즉 시간복잡도가 O(Nlog..