본문 바로가기

IT/알고리즘

최대구간합 구하기 java 버전

반응형

아래와 같은 문제가 있습니다.

 

문제)

[-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]

이렇게 됩니다.

반응형