무한 나무 2024. 3. 28. 19:37

더해서 목표 값이 되는 연속된 범위의 경우의 수

  • 더 할 범위를 표시하는 left/right를 준비한다. (인덱스 값 저장, 0부터 시작)
  • left~right 까지 더해서 목표값보다 작으면 right+1 한다.
  • 목표값보다 크면 left+1 한다.
  • 목표값과 같아지면 카운트하고, left+1한다.

(제한사항 : 모든 수는 양의 정수, 목표도 양의 정수)

    vector<int> seg = { 1,0,2,1,3,2,4,1,8,4,9,3,3,4,2,6,7,2,1,1,3,5 };
    int goal = 12;
    int answer = 0;
    int left = 0, right = 0, sum=1;
    while (right < seg.size())
    {
        if (sum == goal)
        {
            answer++;
            sum -= seg[left++];
        }
        else if (sum < goal)
        {
            ++right;
            if(right< seg.size())
                sum+=seg[right];
        }
        else
            sum -= seg[left++];
    }
    cout << "투 포인터 : " << answer << endl;