더북(TheBook)

1.5.11 최대 합 구하기

문제 1-11 주어진 배열을 회전해 arr[i] × (i+1)의 최대 합을 구하세요.

해결책 1-11

int maxCircularSum(int arr[], int n)
{
    int sumAll = 0;
    int currVal = 0;
    int maxVal;

    for (int i = 0; i < n; i++) {
        sumAll += arr[i];
        currVal += ((i + 1) * arr[i]);
    }

    maxVal = currVal;
    for (int i = 1; i < n; i++) {
        currVal = (currVal + sumAll) - (n * arr[n-i]);
        if (currVal > maxVal) {
            maxVal = currVal;
        }
    }
    return maxVal;
}

/* 테스트 코드 */
int main()
{
    int arr[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
    printf("최대 합: %d", maxCircularSum(arr, sizeof(arr) / sizeof(int)));
}

분석 시간 복잡도는 O(n)이며, 공간 복잡도는 O(1)입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.