본문 바로가기
알고리즘

연속된 부분 합(연속합) - 1 (완전 탐색)

by 까망 하르방 2021. 2. 20.
반응형

완전 탐색

Q) 아래와 같이 배열이 주어질 때 특정 연속 구간의 합 중 최대값을 구하시오.

if) 구간의 길이가 5 일 때, 구간의 최대합은?

길이 6을 가지는 시작 지점(start) ~ 끝 지점(end)까지 합을 매번 더해서 구할 수 있습니다. 

(Sliding Window 혹은 Inchworm Algorithm)

직관적이지만 시간복잡도가 좋다고 할 수는 없습니다.

 

[O(N3) 코드]

int ans = 0;
int N, A[LM];
void findPartialSum(){
    int start, end, i;
    for(start = 1; start <= N; start++){
        for(end = start; end <= N; end++){
            int sum = 0;
            for(i = start; i<=end; i++){
                sum += A[i];
            }
            ans = ans < sum ? sum : ans;
        }
    }
}

 

합을 구하는 과정에서 조금 변형하여 O(N2)으로 구현도 가능

int ans = 0;
int N, A[LM];
void findPartialSum(){
    int start, end;
    for(start = 1; start <= N; start++){
        int sum =0;
        for(end = start; end <=N; end++){
            sum += A[end];
            if(ans < sum) ans = sum;
        }
    }
}

 

전체 코드

#include <iostream>
using namespace std;
const int N = 4;

void findPartialSum(int *arr) {
    int i, j, sum;
    for (i = 0; i < N; ++i){
        sum = 0;
        for (j = i; j < N; ++j){
            sum += arr[j];
            printf("[%d, %d]: %d\n", i, j, sum);
        }
    }
}

int main() {
    int arr[] = {2, 4, 6, 8};
    printf("[ ");
    for(int i=0; i<N; ++i){
        printf("%d ", arr[i]);
    }
    printf("]\n");
    findPartialSum(arr);
}

 

Reference

- 연속된 부분 합(연속합) - 1 (완전 탐색) 

- 연속된 부분 합(연속합) - 2 (Prefix Sum)

- 연속된 부분 합(연속합) - 3 (DP)  

- [구간합] Sum of sub-matrix (2D Array) 

 

관련 문제

[BOJ] 2531 회전초밥

 

반응형

'알고리즘' 카테고리의 다른 글

소수 (Prime Number) 찾기 - 3  (0) 2021.02.21
소수 (Prime Number) 찾기 - 2  (0) 2021.02.21
소수(Prime Number) 찾기 - 1  (0) 2021.02.20
세그먼트 트리(Segment Tree)  (0) 2021.02.20
[수학] 피보나치 수열 구현 (재귀, DP)  (1) 2021.02.18

댓글