룬아님의 취중코딩

Codility 26번 MaxDoubleSliceSum 본문

개발/알고리즘

Codility 26번 MaxDoubleSliceSum

룬아님 2019. 9. 25. 10:37

MaxDoubleSliceSum

 

A non-empty array A consisting of N integers is given.

A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.

The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1] + A[Y + 1] + A[Y + 2] + ... + A[Z − 1].

For example, array A such that:

A[0] = 3 A[1] = 2 A[2] = 6 A[3] = -1 A[4] = 4 A[5] = 5 A[6] = -1 A[7] = 2

contains the following example double slices:

  • double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,
  • double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,
  • double slice (3, 4, 5), sum is 0.

The goal is to find the maximal sum of any double slice.

Write a function:

class Solution { public int solution(int[] A); }

that, given a non-empty array A consisting of N integers, returns the maximal sum of any double slice.

For example, given:

A[0] = 3 A[1] = 2 A[2] = 6 A[3] = -1 A[4] = 4 A[5] = 5 A[6] = -1 A[7] = 2

the function should return 17, because no double slice of array A has a sum of greater than 17.

Write an efficient algorithm for the following assumptions:

  • N is an integer within the range [3..100,000];
  • each element of array A is an integer within the range [−10,000..10,000].

 

class Solution {
    public int solution(int[] A) {
         if(A.length == 1) return A[0];
    
        int localMaxSum = A[1];
        int globalMaxSum = A[1];
        int maxpos = 1;
        int minpos = 1;
    
        for(int i = 2 ; i < A.length - 1; i++) {
            localMaxSum = Math.max(A[i], localMaxSum + A[i]);
            if(globalMaxSum <= localMaxSum){
                globalMaxSum = localMaxSum;
                maxpos = i;
            }
        }
        
        int temp = globalMaxSum;
        int min =A[maxpos];
        for(int i = maxpos; i >= 1; i--){
            if(min > A[i]){
                min = A[i];
            }
            temp -= A[i];
            if(temp == 0){
                minpos = i;
                break;
            }
        }
        
        if(min > 0 && (maxpos <= A.length-3 || minpos >=2)){
            return globalMaxSum;
        }
        //System.out.println(maxpos);
        //System.out.println(min);
        return globalMaxSum - min;
    }
}

https://app.codility.com/demo/results/training5QZBVV-ZDU/

반응형

'개발 > 알고리즘' 카테고리의 다른 글

Codility 29번 Peaks  (0) 2019.09.30
Codility 28번 MinPerimeterRectangle  (0) 2019.09.30
Codility 27번 CountFactors  (0) 2019.09.23
Codility 25번 MaxSliceSum  (0) 2019.09.22
Codility 23번 EquiLeader  (0) 2019.09.17
Comments