먼지 쌓인 키보드

[백준 2003번][투 포인터] 수들의 합2 본문

공부 관련/Programming

[백준 2003번][투 포인터] 수들의 합2

Under_Desk 2019. 2. 25. 21:25
반응형

백준 2003번 수들의 합

 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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int n, m, cnt;
int a[10001];
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n;
    cin>>m;
 
    for (int i = 1; i <= n; i++){
        cin>>a[i];
    }
 
    int j = 2, sum = a[1];
    
    // (a[1]+a[2]+a[3])>=m 라면 a[1]+a[2]+a[3]+a[4]+a[5]-a[1]
    for (int i = 1; i <= n;i++){
        while (sum<m){//i~j번째까지의 합 합이 m보다 크거나 같을때까지
            if (j > n) break;//j가 n의 범위를 넘어갔을때
            sum += a[j++];//j번째까지의 합
        }
 
        if (sum == m) cnt++;//합이 m과 같을때 카운트를 증가
        sum -= a[i];//맨앞의 a[i]번째를 빼주어, sum은 a[i+1]부터의 합이 된다.
        // (a[1]+a[2]+a[3])>=m 라면 a[1]+a[2]+a[3]+a[4]-a[1]
        //1번부터 sum에 합하고 m보다 클때는 첫번째 더한것을 뺀다.
    }
 
    printf("%d\n", cnt);
}
cs

 

반응형
Comments