Baekjoon Review

[Gold 4] 1806 부분합

hanseongbugi 2024. 9. 23. 21:30

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

 

투포인터를 사용하는 문제이다.

초기 문제를 분석할 때 투포인터를 사용해야한다는 것을 알 수 있었다.

 

10 15
5 1 3 5 10 7 4 9 2 8

 

위 숫자가 주어질 때 15를 만들기 위해서는 5와 10을 사용하면 최소의 개수로 15라는 값을 만들 수 있다.

 

이는 투포인터를 사용해 0번째 인덱스부터 N-1 번째 인덱스까지 부분합을 구하면 알 수 있다.

즉, 초기 0번째 인덱스의 값이 5이므로 15보다 작게된다. 그러면 1을 더한다.

그후, 3 5, 10까지 더햇다면 24가 되므로 목표 값인 15를 초과하게 된다.

그러면 24에서 5를 뺸 값을 확인한다. 확인 결과 목표 값을 초과하므로 1, 3을 순차적으로 뺸다.

최종적으로 5 + 10을 통해 15를 구할 수 있다.

 

위 과정을 투 포인터를 사용해 이후에 나올 수 있는 더 짧은 경우도 구할 수 있다.

 

#include <iostream>
using namespace std;

int N, S;
int arr[100001];
int answer = 987654321;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>N>>S;
    for(int i = 0;i<N;i++)
        cin>>arr[i];
    
    
    int s = 0, e = 0;
    int sum = 0;
    while(e<=N){
        if(sum >= S){
            answer = min(answer,(e - s));
            sum -= arr[s++];
        }
        else{
            sum += arr[e++];
        }
    }
    if(answer == 987654321)
        answer = 0;
    
    cout<<answer;
}