python 부분합, 연속 부분수열 최대합
부분합
부분합은 배열의 시작부터 현재 위치까지의 원소의 합을 구해둔 배열(paritial_sum)입니다.
다음의 표를 보면 partial_sum을 미리 계산하면 특정 구간의 합을 O(1)에 구할 수 있습니다.
예를 들어 3번째부터 5번째의 합을 구하고 싶다하면 partial_sum[5] - partial_sum[3-1] = 510-275 = 235를 구할 수 있습니다.
이 공식을 이용하면 구간합을 구할 수 있게 됩니다.
위의 예제로 테스트 해보면 다음과 같습니다.
연속 구간 부분수열 최대합
자 그러면 입력에 음수가 들어가는 경우에서 연속 구간 부분수열 최대합을 구해봅시다.
이때 최대를 구하려면 어떻게 해야할까요?
인덱스 1~3까지의 부분합은 19, 1~5까지의 부분합은 24입니다. 여기서 연속 구간 부분수열 최대합은 24입니다.
부분합을 구하는 것은 비슷하고 max 최대치를 구간별로 탐색해야 합니다. 각 구간의 인덱스를 관리하기 위해서는 2중 for문을 써야하므로 O(N^2)가 되겠죠?
위의 예제를 풀어보면
동적 계획법
자 이제 동적 계획법을 적용해보죠
'Algorithm' 카테고리의 다른 글
백준 삼성 코딩 기출 문제 - 구슬 탈출2 python (0) | 2019.10.16 |
---|---|
백준 삼성 코딩 기출 문제 - 구슬 탈출 python (5) | 2019.10.16 |
Python 구간 사이의 최소 제곱근 찾기 (0) | 2019.09.27 |
graph shortest path - 최단 경로 다익스트라 알고리즘 python (0) | 2019.09.27 |
2017년 카카오 blind 코딩 테스트 - 뉴스 클러스터링 python (0) | 2019.09.25 |