본문 바로가기

LIS 최장 증가 수열 예를들면 3 1 2 4 8 6 7 라는 배열이 있다면 가장 길게 증가하는순으로 정렬된 배열을 말한다 위 예제에선 1, 2, 4, 6, 7 이 가장 긴 증가 부분수열이다. DP를 이용해 손쉽게 n^2 시간으로 풀수있다. arr = [3, 1, 2, 4, 8, 6, 7] n = len(arr) dp = [1] * n for i in range(1, n): for j in range(i): if arr[j] < arr[i]: dp[i] = max(dp[i], dp[j] + 1) res = max(dp) 하지만 n의크기가 10만정도로 커진다면? 바로 nlgn 으로 풀수있는 알고리즘이 존재한다. 원리는 임의의 배열에 입력이 들어올때마다 정렬된 형태를 유지하며 가장 큰값보다 큰입력이 들어올경우 새로 추가하고 그것이.. 더보기
펜윅트리로 최소값구하기 펜윅트리란 어떤 배열의 특정구간 구간합과같은 쿼리가 많을경우 별도의 특별한 트리구조를 만들어 이를통해 시간복잡도문제를 해결하기 위한 자료구조입니다. 펜윅트리말고도 이와같은 트리로 세그먼트트리도 있으나 개인적으로 펜윅트리가 구현하기 깔끔하고 필요한 트리를 만들기위한 메모리를 절약할수 있으며 속도도 왠만하면 더 빠른기대값을 얻을수 있습니다. 하지만 펜윅트리로는 최소값, 최대값같은 구간값을 일반적으로 구할수가 없습니다. 구간합 같은경우 A - B 구간의 합을 구할때 1-B까지의 구간합 - 1-A까지의 구간합을 통해 계산하며 되지만 최대값 최소값같은경우 펜윅트리의 구조상 생략되는 값이 존재하기때문입니다. 펜윅트리는 어떤수를 2진수로 표현할때 1의 위치, 개수에따라 값을 구하는 방식으로 만들어지는 방식을 살펴보면.. 더보기
5582 공통 부분 문자열 [LCS] LCS란 Longest Common Subsequence 즉 최장 공통 부분문자열을 구하는 알고리즘입니다.예를들면 'ABCD' 와 'CDEFG' 라는 문자열이 있을때 'CD'라는 부분 문자열이 최장 공통 부분 문자열이 됩니다. 문자열의 길이가 짧은 경우에는 두 문자열의 모든 부분문자열을 비교해 찾을수 있지만 문자열이 길어질경우 많은 시간이 걸리게 됩니다. 다음은 모든 문자열을 비교해 찾는 소스코드입니다. 아주간단합니다. a = input() b = input() a_len = len(a) b_len = len(a) res = 0 for i in range(b_len): for j in range(i + 1, b_len + 1): if a.find(b[i:j]) != -1: res = max(res, le.. 더보기