본문 바로가기

알고리즘

Boj 1806 c++ 부분합

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.

두 포인터로 풀이하였다. 

구간을 하나씩 앞뒤로 조절하며 조건을 만족하는 경우에는 각각 결과값을 갱신해준다.

#include<iostream>
using namespace std;
int arr[100001];
int main(){
	int N, S, Min_len=99999;
    bool found=false;
    cin>>N>>S;
	for(int i=0; i<N; i++){
        cin>>arr[i];
    }
    int head=0, tail=0, sum=0;
	while(tail<=N){
        if(sum<S){
            sum+=arr[tail++];
        } else {
            found=true;
            Min_len=min(Min_len, tail-head);
            sum-=arr[head++];
        }
    }
    if(found){
        cout<<Min_len;
        return 0;
    } cout<<"0";

}

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

Boj 1149 c++ RGB거리  (0) 2025.07.14
Boj 16936 c++ 나3곱2  (4) 2025.07.14
Boj 12851 & 13913 c++ 숨바꼭질 2, 4  (0) 2025.07.07
Boj 1697 c++ 숨바꼭질 (백준 복귀)  (0) 2025.07.06
Boj 23250 c++ 하노이 탑 K  (0) 2025.06.16