꿈꾸는 개발자

코딩 테스트 공부 - 구간 합 본문

코딩 테스트

코딩 테스트 공부 - 구간 합

Anssony 2023. 12. 20. 14:52

코딩 테스트를 공부할 때 미리 자신만의 스니펫을 구성해두는 것을 추천한다.

 

간단한 코딩테스트의 경우 쉽게 문제를 풀 수 있지만, 난이도가 높은 문제일수록 쉬운 알고리즘들을 미리 스니펫을 구성해둔 상태로 진행하는 것이 시간을 단축 시킬 수 있다.

 

이번 포스팅에는 특정 구간에 대한 값의 합을 구하고 싶을 때, 사용되는 구간 합 스니펫을 구현해보았다.

시간 복잡도는 $ O(n) $ 이다.

 

배열 A 가 존재할 때, 배열 A의 인덱스까지의 누적 합을 배열 S 로 표현한 것은 다음과 같다.

S[i] = S[i-1] + A[i]

#include<iostream>
#include <vector>

int main() {
    vector<int> A;
    vector<int> S;

    A.push_back(1);
    A.push_back(2);
    A.push_back(3);
    A.push_back(4);
    A.push_back(5);
    A.push_back(6);
    A.push_back(7);
    A.push_back(30);

    // 벡터 S에 벡터 A의 누적 합을 저장
    for (int i = 0; i < A.size(); i++) {
        if (i == 0)
        S.push_back(A.at(i));
        else
        S.push_back(S.at(i - 1) + A.at(i));
    }

    // 벡터 A 출력
    for (int i = 0; i < A.size(); i++) {
        cout << A.at(i) << " ";
    }

    cout << endl;

    // 벡터 S 출력
    for (int i = 0; i < S.size(); i++) {
        cout << S.at(i) << " ";
    }

    return 0;
}

 

배열 S 에서 인덱스 i 부터 j 까지의 구간 합을 구하고 싶다면 다음과 같이 나타낼 수 있다.

구간 합 = S[j] - S[i-1]

    // 구간 합
    int start = 3;
    int end = 7;
    cout << endl;
    cout << S.at(end) - S.at(start - 1) << endl;

 

앞으로 이러한 간단한 알고리즘부터 스니펫을 적어놓으려고 한다.