본문 바로가기
Programming Solve/BOJ

BOJ 2003 - 수들의 합 2 / C++

by msm1029 2022. 2. 21.
반응형

문제 링크 : 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

 

문제 풀이

투 포인터 알고리즘을 사용한다. 두 포인터는 모두 인덱스 0에서 시작한다.

 

목표는 m을 만드는 것이므로 합이 m보다 작다면 끝 포인터(en)을 늘려나가며 sum에 더해나간다.

 

만약 합이 m보다 크다면 앞 포인터(st)의 수를 뺀다. 이 때, 앞 포인터가 끝 포인터보다 커진다면 그 지점에 두 포인터를 위치시키고 다시 더해나간다.

 

만약 합이 정확히 m이 되면 정답 카운트를 증가시켜준다.

 

소스 코드

#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    
    int n, m;
    vector<int> v;
    cin >> n >> m;

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }

    int st = 0, en = 0, sum = v[0], cnt = 0;

    while(st <= en && en < n){
        if(sum < m){
            sum += v[++en];
        }
        else if(sum == m){
            cnt++;
            sum += v[++en];
        }
        else { //sum이 m보다 클 때
            sum -= v[st++];

            if(st > en){
                en = st;
                sum = v[st];
            }
        }
    }

    cout << cnt;
}
반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 11723 - 집합 / C++  (0) 2022.02.27
BOJ 1100 - 하얀 칸 / C++  (0) 2022.02.27
BOJ 2559 - 수열 / C++  (0) 2022.02.20
BOJ 6438 - Reverse Text / C++  (0) 2022.02.20
BOJ 2667 - 단지 번호 붙이기 / C++  (0) 2022.02.13