PS/브루트포스 알고리즘[Bruteforce]

백준 2003 수들의 합2(c++)

SeungbeomKim 2022. 10. 14. 03:57

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

<코드>

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    vector<int>v;
    int cnt = 0;
    for(int i=0;i<n;i++)
    {
        int num;
        cin>>num;
        v.push_back(num);
    }

    int sum =0;
    int start = 0;
    int end = 0;
    while(1)
    {
        if(sum>m) sum -= v[start++];
        else if(end == n) break;
        else sum += v[end++];

        if(sum==m) cnt++;
    }
    cout<<cnt<<'\n';
}

<풀이 과정>

이 문제는 연속된 수의 합이 m이 되는지 물어보는 문제이다 (하나도 가능하다)

일단은 벡터에 모든 수를 push해주고 index를 두개 만들어줘야 한다.(시작 인덱스, 종착 인덱스)

 

처음에 m(더해서 원하는 값)보다 작은 경우에는 값을 지속적으로 더해주면 되지만,

값이 m보다 커지면, 가장 앞에 인덱스부터 차근차근 빼줘야 한다. 왜냐하면 중간에 있는 인덱스에 해당하는 값을 빼준다면 연속된 값이 나올 수 없기 때문이다. 그리고 sum이 m이 되면 값을 cnt(개수)를 추가해주면 끝이다!