19. maximum subarray [10 1주차]

Posted by aliontory on January 15, 2024 · 27 mins read

19. Maximum Subarray [10-1주차]

2024 1 14일 일요일

오전 2:26

<Maximum Subarray 문제>

정수(음수 포함)들의 배열에서 연속된 부분 배열을 합이 최대가 되도록 찾는 문제이다.

 

부분배열의 길이가 0인 경우를 허용하는 경우, 허용하지 않는 경우에 따라 답을 구하는 방법이 살짝 달라진다.

 

 

<O(n3) 풀이>

모든 경우를 다 찾아 비교하면 된다.

만들어질 수 있는 부분 배열은 약 nC2가지, O(n2)개이다. 부분 배열 하나의 합을 계산하는 데 최대 O(n)시간이 걸리므로, O(n3)이 걸린다.

 

 

<O(n2) 풀이>

부분 배열의 합을 구할 때 중복 계산을 줄인다. 이전에 구했던 더 작은 부분 배열에 원소를 더하면 된다.

 

 

<O(n) 풀이 : Idea 1>

0<= i < n

i에서 끝나는 합이 가장 큰 부분 배열의 합을 S[i]라 한다.

S[i+1]이 될 수 있는 값은 S[i]+A[i+1] 또는 A[i+1]뿐이다.

S[i] A[ai]일 때, A[ai] + A[i+1]이 가장 클 순 없다. A[ai] S[i]로 바꾸면 더 커지기 때문.

 

S[i+1] = max(S[i] + A[i+1], A[i+1])

 

 

<Idea 2>

A[i]를 포함하는 최대 부분 배열의 합과 A[i]를 포함하지 않는 최대 부분 배열의 합을 0<=i<n마다 각각 구한다.

 

 

<Idea 3>

Prefix sum 배열 B를 이용하는 방법.

A[0]부터 A[i]까지의 합의 배열 B를 구한다.

k < i이고, B[k]가 가장 작도록 하는 인덱스 k를 찾는다.

그러면 S[i] = B[i] - B[k]이다.

 

OneNote에서 작성되었습니다.