Array - Find Pivot Index

JeongChaeJin·2022년 11월 10일
0

Find Pivot Index

  • Reference
  • Sliding Window 알고리즘을 익히기 좋은 문제다.
    • Sliding Window 알고리즘은 모든 수가 양수일 때 사용할 수 있는 알고리즘이다.

Algorithm

  • 부르트 포스로 풀면 Pivot 이동 O(n) 연산과 해당 Pivot 시 발생하는 왼쪽, 오른쪽의 누적합 알고리즘이 합쳐진다면 O(n^2)이 예상된다.
  • 하지만 Sliding Window 알고리즘을 적용하면, Pivot 이동 연산 O(n)과 오른쪽 합을 초기 총 합 O(n), 왼쪽 합을 초기 0으로 잡고, 오른쪽 합에 Pivot을 빼주는 연산, 왼쪽 합에 Pivot 값을 더해주는 연산을 O(1)을 수행하면 거즌 O(n)의 연산으로 마무리할 수 있다.
  • 합이 Target 값을 갖는 SubArray를 찾는 문제로도 확장 가능하다.

Implementation

#include <iostream>
#include <vector>
#include <numeric>

int findPivotIdx(const std::vector<int> &v)
{
    int rightSum = std::accumulate(v.begin(), v.end(), 0);
    int leftSum = 0;
    int prevPivot = 0;

    for (int idx = 0; idx < v.size(); ++idx)
    {
        rightSum -= v[idx];
        leftSum += prevPivot;

        if (rightSum == leftSum)
            return idx;

        prevPivot = v[idx];
    }

    return -1;
}

int main()
{
    std::vector<int> v = {1, 8, 2, 9, 2, 3, 6};

    int pivotIdx = findPivotIdx(v);

    std::cout << "Pivot Index is : " << pivotIdx << std::endl;

    return 0;
}
Pivot Index is : 3
profile
OnePunchLotto

0개의 댓글