반응형
아래와 같은 문제가 있습니다.
문제)
[-7, 4, -3, 6, 3, -8, 3, 4,-2] 와 같은 배열이 있다.
이 때 배열 내 부분 최대합을 구하라.
답)
4 - 3 + 6 + 3 = 10
이를 프로그램으로 구현하기 위한 방법은 여러가지가 있습니다.
그 중 가장 단순한 방법으로 루프를 이용해 최고값을 찾아내는 방법이 있습니다. 아래 예제는 마이너스 최대값은 0으로 표시합니다.
위와같이 반복문 안에 다 시 반복문 형식으로 모든 경우의 수를 비교하는방법은 O(N^2) 의 시간복잡도를 가지게 됩니다.
아래는 O(N^2) 의 시간 복잡도를 줄이기 위한 방법으로 배열을 절반으로 나눠 재귀호출을 이용한 방법입니다.
마지막으로 동적 계획법을 사용하여 선형(N)의 시간복잡도를 갖도록 처리한 프로그램입니다.
간단히 설명하면
최대값 max , 구간 합 psum
1.루프를 실행하면서 psum 에 값을 더해주고 max에는 psum 중 최대값을 저장한다.
2. psum 이 0 보다 작아지면 0으로 설정한다.
예를 들면
숫자 : [3 , 5,-4,1,-7, 2, 8,-3, 5,-1]
sum : [3 , 8, 4, 5, 0, 2,10, 7,12,11]
max : [3 , 8, 8, 8, 8, 8,10,10,12,12]
이렇게 됩니다.
반응형