https://www.acmicpc.net/problem/1806

백준의 부분합 문제입니다.
배열의 구간내에서 특정 구간의 합이 S 이상인 구간 중 가장 짦은 구간을 구하는 문제입니다.
저는 투포인터에 약한 모습을 보이기에 강화하고자 문제를 풀었습니다.

풀이방법입니다.

두개의 포인터를 의미하는 l (left), r (right)를 0번 idx로 정합니다.

그리고 해당 l과 r 2개 사이에서 가지고 있는 포인터의 구간의 합을 구합니다. (초기 값은 0번 idx만이므로 0번 idx의 값입니다.)

그리고 만약 구간합이 S보다 적다면 더 많은 구간을 포함해야 하므로 r를 오른쪽으로 한칸 이동하고 다시 구간합을 구합니다.

만약 구간합이 S보다 크거나 같다면 구간의 길이를 더 줄여볼 여지가 있다는 의미이므로 l을 오른쪽으로 옮기고 구간의 합을 다시 구합니다.

이 때 구간을 바꿀 때 매번 구간내의 합을 구하면 시간복잡도면에서 투포인터를 하는 의미가 없으므로 이전에 구한 합에서 빼거나 더하는 식으로 진행합니다.

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int N,S,mn=1e9;
vector<int> v;
int main(){
    cin >> N >> S;
    for(int i=0;i<N;i++) {
        int input; cin >> input;
        v.push_back(input);
    } 
    int l = 0, r= 0;
    long long sum = v[0];
    while(l<=r && r<N){
        if(sum<S) {
            if(++r < N) sum += v[r];
        }
        else {
            sum -= v[l];
            mn = min(mn,r-l+1);
            l++;
        }
    }
    if(mn == 1e9) cout << 0;
    else cout << mn;
}

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

[프로그래머스] 보석 쇼핑  (0) 2021.01.03
[백준 2470] 두 용액  (0) 2021.01.01
[백준 20167] 꿈틀꿈틀 호석 애벌레 - 기능성  (0) 2020.12.29
[백준 1360] 되돌리기  (0) 2020.06.05
[백준 1987] 알파벳  (0) 2020.04.09

+ Recent posts